Github 地址:chaosrings/wcPro
1.PSP2.1表格
psp 2.1 | psp阶段 | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 10 |
Estimate | 估计这个任务需要多少时间 | 10 | 10 |
Development | 开发 | 200 | 250 |
Analysis | 需求分析(包括学习新技术) | 60 | 150 |
Design Spec | 生成设计文档 | 20 | 20 |
Design Review | 设计复审(和同事审核设计文档) | 10 | 10 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 20 | 20 |
Design | 具体设计 | 30 | 30 |
Coding | 具体编码 | 150 | 200 |
Code Review | 代码复审 | 30 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 150 | 200 |
Reporting | 报告 | 10 | 10 |
Test Report | 测试报告 | 20 | 20 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 30 | 30 |
合计 | 750 | 1000 |
2.基本任务
- 接口实现 main()
我负责的模块是main函数部分的对输入参数的处理以及对输入参数进行有效性的检验,同时对于给定的Scanner类进行初始化工作,将目标参数传入目标函数,完成存储文件的语句。
由于是控制台出入口函数,接口为main(),完成不同模块的组装和参数传输作用。
引用的构造函数有:Lex(const string & str)、Lex()、Scanner()、~Scanner()& saveToFile(const vector<pair<string, int>> &frequencyVec)。
具体代码如下:
int main(int argc, char* argv[])
{
if (argc != 2)
{
cout << "syntax error!" << endl;
return -1;
}
Scanner scan;
string filePath = argv[1];
string targetStr= scan.getString(filePath);
Lex lex;
lex.setTargetStr(targetStr);
vector<pair<string, int > > wordFreqVec = lex.getWordFreqVec();
saveToFile(wordFreqVec);
return 0;
}
```c++
输入参数为argc 和argv[],返回运行正确与否的结果,过程中对输入参数个数进行判断,原则上只允许两个参数输入。一次调用Scanner返回文件中的字符串然后传入getWordFreqVec()函数中进行词频统计和排序。最后在saveToFile()中存储文件到本地。
####3.测试用例设计
该函数中只有两个分支结点,故只需要3个测试用例就可以覆盖到所有的路径。
![](https://images2018.cnblogs.com/blog/1344288/201804/1344288-20180408212358024-466953748.png)
另外几个测试用例测试正常情况、参数过多、后缀测试、无有效返回值。因为等价类较少故不好设计到20个用例,6个有效用例已经是极限。
| Test Case ID | Test Item | Test Case Title | Test Criticality | Pre-condition | Input | Procedure | Output | result | Status | Remark(Test method) |
| ------------ | --------- | --------------- | --------------- | ------------- | ----- | --------- | ------ | ------ | ------ | ------------------- |
| 1 | main | Else | Parameters Lost | M |none |wcPro.exe |none |-1 |-1 | Pass |
|2 | main | Else | Parameters error Test | M | none |wcPro.exe -a |none |-1 |-1 |Pass |
| 3 |main | Else | Parameters Overflow | M |none | wcPro.exe -a text.txt | none | -1 | -1 | Pass |
| 4 | main | Else | Parameters correct Test | H |none | wcPro.exe text1.txt | none | 0 |0 | Pass |
| 5 | main | Else | File Postfix Test | H | none | wcPro.exe text.c | 有效字符为空 | 有效字符为空 | 0 | Pass |
| 6 | main | Else | Input invalid | H |none | wcPro.exe text1.txt | none | -2 | -2 | Pass |
因为是对主函数入口进行的修改和测试,故单元测试的优越性也就不存在了,我进行了人工逐个验证,都是符合预期结果。
---
###扩展任务:静态测试
#### 1.参照代码规范
[Google开源项目风格指南,C++风格指南](http://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/contents/)
[现代软件工程讲义 3 代码规范与代码复审](http://www.cnblogs.com/xinz/archive/2011/11/20/2255971.html)
####2.对组员201517150的代码评审
```c++
void saveToFile(const vector<pair<string, int> > &frequencyVec)
{
ofstream outputFile("result.txt", ofstream::out);
int cnt = 0;
if (outputFile.is_open())
{
if (frequencyVec.size() == 0)
cout << "无有效输入" << endl;
for(int i=0;i<(int)frequencyVec.size()&&i<100;++i)
outputFile << frequencyVec[i].first << ":" << frequencyVec[i].second << endl;
outputFile.close();
}
}
通过静态分析可以发现其中cnt的变量没有用到。
对这个函数的功能说明我觉得有必要放在整个函数体前面进行说明和参数说明。
另外对于单句的for循环语句,虽然这个地方没有很复杂所以还能清晰的看出来,但是随着代码量的增加之后,代码的可读性就会下降,建议可以在一些复杂的循环判断结构之前进行提前的注释说明。
整个代码看上去过于紧凑,方便阅读的话一般就会在不同的标识符之间进行空格显得相对疏松。
3.静态检查工具
我使用了cppcheck工具对代码进行了静态检查工作。
4.静态检查扫描结果
我的代码部分没有发现静态错误,说明代码的静态检查是通过的,也就是没有出现一些变量名未使用以及重复定义等问题。
5.小组代码分析
因为整个项目的代码量不算大,所以进行代码分析的时候就会相对容易一点,整个代码都比较紧凑,对于每个判定条件都是比较恰当的。但是因为不同模块的可优化部分差别有点大,部分同学的工作量就比其他人多的多了,我们的划分还是有点不均匀。整体是符合要求的规范化代码书写和测试。
作业小结:
这次和上次不同是小组合作完成的作业,自己很庆幸能够和学弟们组队并比较顺利的完成这次任务,对于整个开发、测试以及软件质量之间的关系有了比较清楚的认识,一个软件的质量从一个整体来保证是比较困难的,但是经过合理的功能划分和单元测试、模块测试、系统测试能够更大程度上规避软件缺陷,开发的过程中要有测试的意识,这不仅仅可以提升自己的代码质量同时对于后期测试的工作也可以缓解。当然现在一般的主流软件开发过程中,测试过程时间的定义一直就比较模糊,可能是为了更好的权衡开发成本和质量之间的关系吧。