经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
软件测试第三次作业
来源:cnblogs  作者:Rgbit  时间:2018/10/21 20:06:43  对本文有异议

内容目录

项目概览

功能简述

完成了 WordCount 的基本功能和扩展功能,并允许使用 -h 选项显示帮助信息。

  1. Usage: wc [OPTION]... [FILE]
  2. Options:
  3. -c 获取文件字符数
  4. -w 获取文件单词数
  5. -l 获取文件行数
  6. -a 获取文件代码行、空行、注释行数
  7. -e 获取文件单词数时使用停用词表
  8. -s 递归处理目录下的文件
  9. -o 指定输出文件名
  10. -h 显示帮助信息
  11. 参数 FILE 支持通配符 * ?

模块划分

项目主要划分为四个模块:

  1. +-- WordCount
  2. +-- ArgParser.cs 命令行参数解析
  3. +-- Counter.cs 字符、单词、行数等的统计
  4. +-- FileHelper.cs 文件匹配与递归匹配
  5. +-- Program.cs 应用程序入口

代码互审

编码由我们两个合作完成,在编写时便互相检查了代码,各自代码的完成情况良好,无较大问题。

静态代码检查

编码完成后使用了 Visual Studio 自带的代码分析工具进行了静态代码检查,检查结果如下:

参考静态代码检查的结果我们对代码进行了一定的修改,忽略了部分警告,再次检查的结果如下:

单元测试

我主要完成 Counter 模块的单元测试,单元测试使用的工具为 NUnit 框架。

模块 Counter 的单元测试代码如下:

  1. public class CounterTest
  2. {
  3. [Test]
  4. public void TestCountChar() {
  5. int charCount = WordCount.Counter.CountChar(GetResource("hello.c"));
  6. Assert.AreEqual(95, charCount, "字符统计出错");
  7. }
  8. [Test]
  9. public void TestCountWord() {
  10. int wordCount = WordCount.Counter.CountWord(GetResource("hello.c"));
  11. Assert.AreEqual(14, wordCount, "单词统计出错");
  12. int wordCountWithStopList = WordCount.Counter.CountWord(
  13. GetResource("hello.c"), GetResource("stoplist.txt"));
  14. Assert.AreEqual(12, wordCountWithStopList, "单词统计使用停用词表时出错");
  15. }
  16. [Test]
  17. public void TestCountLine() {
  18. int lineCount = WordCount.Counter.CountLine(GetResource("hello.c"));
  19. Assert.AreEqual(6, lineCount, "行数统计出错");
  20. }
  21. [Test]
  22. public void TestCountComplex() {
  23. List<int> result = Counter.CountComplex(GetResource("complex.cpp"));
  24. Assert.AreEqual(5, result[0], "代码行统计出错");
  25. Assert.AreEqual(3, result[1], "空行统计出错");
  26. Assert.AreEqual(3, result[2], "注释行统计出错");
  27. }
  28. /// <summary>
  29. /// 获取 Resource 目录中的测试资源文件
  30. /// </summary>
  31. /// <param name="name">测试资源文件名</param>
  32. /// <returns>测试资源文件的完整路径</returns>
  33. private string GetResource(string name) {
  34. string projectDirectory = Path.GetDirectoryName(
  35. Path.GetDirectoryName(TestContext.CurrentContext.TestDirectory));
  36. return Path.Combine(projectDirectory, "Resource", name);
  37. }
  38. }

测试文件内容:

hello.c:

  1. #include <stdio.h>
  2. int main(int argc, char* argv[]) {
  3. printf("Hello World !");
  4. return 0;
  5. }

complex.cpp:

  1. // 本文件用于代码行,空行,注释行统计测试
  2. // 这是一个代码行
  3. #include <stdio.h>
  4. int main(int argc, char* argv[]) {
  5. printf("Hello World !"); // 这行既是代码行也是注释行
  6. return 0;
  7. }

stoplist.txt:

  1. int return

单元测试结果:

  1. DomainUsage: Single
  2. Selected test(s): Test.CounterTest
  3. ....
  4. Tests run: 4, Errors: 0, Failures: 0, Inconclusive: 0, Time: 0.6020344 seconds
  5. Not run: 0, Invalid: 0, Ignored: 0, Skipped: 0

运行测试

Program 模块为应用程序入口,难以通过单元测试模块完成测试工作,因此进行实际的运行测试。

匹配处理目录下的 .cs 文件:

递归匹配处理目录下的 .cs 文件:

性能测试

性能测试工具也是 Visual Studio 内置的探测工具,测试结果截图如下:

可以看到,主要的开销发生在 Counter.CountWord 方法中,由于需要对读取的内容进行正则匹配,因此相对耗时。

其他的,主要集中在 StreamReader.ReadLine 造成的 I/O 操作上。

程序优化可以考虑减少 I/O 操作,毕竟部分方法内部操作的差别不是很大,共同的代码也集中在 I/O 部分。

对于正则表达式部分,如果修改为 字符判断 的话,可能可以提高一定的性能。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号