软件测试第三次作业
内容目录
项目概览
- 合作者:
201631062417
,201631062617
- 代码地址: 软件测试作业 - WordCount
- 作业链接: 软件测试第三次作业
功能简述
完成了 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
部分。
对于正则表达式部分,如果修改为 字符判断 的话,可能可以提高一定的性能。