软件测试第三次作业

内容目录

项目概览

功能简述

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

Usage: wc [OPTION]... [FILE]

Options:
  -c  获取文件字符数
  -w  获取文件单词数
  -l  获取文件行数
  -a  获取文件代码行、空行、注释行数
  -e  获取文件单词数时使用停用词表
  -s  递归处理目录下的文件
  -o  指定输出文件名
  -h  显示帮助信息

参数 FILE 支持通配符 * 和 ?

模块划分

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

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

代码互审

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

静态代码检查

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

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

单元测试

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

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

public class CounterTest
{
  [Test]
  public void TestCountChar() {
    int charCount = WordCount.Counter.CountChar(GetResource("hello.c"));
    Assert.AreEqual(95, charCount, "字符统计出错");
  }

  [Test]
  public void TestCountWord() {
    int wordCount = WordCount.Counter.CountWord(GetResource("hello.c"));
    Assert.AreEqual(14, wordCount, "单词统计出错");

    int wordCountWithStopList = WordCount.Counter.CountWord(
      GetResource("hello.c"), GetResource("stoplist.txt"));
    Assert.AreEqual(12, wordCountWithStopList, "单词统计使用停用词表时出错");
  }

  [Test]
  public void TestCountLine() {
    int lineCount = WordCount.Counter.CountLine(GetResource("hello.c"));
    Assert.AreEqual(6, lineCount, "行数统计出错");
  }

  [Test]
  public void TestCountComplex() {
    List<int> result = Counter.CountComplex(GetResource("complex.cpp"));

    Assert.AreEqual(5, result[0], "代码行统计出错");
    Assert.AreEqual(3, result[1], "空行统计出错");
    Assert.AreEqual(3, result[2], "注释行统计出错");
  }

  /// <summary>
  /// 获取 Resource 目录中的测试资源文件
  /// </summary>
  /// <param name="name">测试资源文件名</param>
  /// <returns>测试资源文件的完整路径</returns>
  private string GetResource(string name) {
    string projectDirectory = Path.GetDirectoryName(
      Path.GetDirectoryName(TestContext.CurrentContext.TestDirectory));
    return Path.Combine(projectDirectory, "Resource", name);
  }
}

测试文件内容:

hello.c:

#include <stdio.h>

int main(int argc, char* argv[]) {
  printf("Hello World !");
  return 0;
}

complex.cpp:

// 本文件用于代码行,空行,注释行统计测试

// 这是一个代码行

#include <stdio.h>

int main(int argc, char* argv[]) {
  printf("Hello World !");  // 这行既是代码行也是注释行
  return 0;
}

stoplist.txt:

int return

单元测试结果:

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

运行测试

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

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

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

性能测试

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

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

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

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

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

posted @ 2018-10-21 15:12  rgb-24bit  阅读(342)  评论(0编辑  收藏  举报
隐藏