• 软件测试第三次作业


    内容目录

    项目概览

    功能简述

    完成了 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 部分。

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

  • 相关阅读:
    hdu5616 暴力枚举
    codeforce 35C fire again
    常用代码及经验总结(不断更新)
    codeforce AIM tech Round 4 div 2 B rectangles
    codeforce diversity
    codeforce 589B枚举
    codeforces 1A
    自学Java测试代码
    自学Jav测试代码三 Math类 & Date & GregorianCalendar类
    数学类与图形类
  • 原文地址:https://www.cnblogs.com/rgbit/p/9821114.html
Copyright © 2020-2023  润新知