一、项目GitHub地址
https://github.com/ReWr1te/WcPro
二、项目PSP表格
PSP2.1 | PSP阶段 | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 20 |
· Estimate | · 估计这个任务需要多少时间 | 20 | 20 |
Development | 开发 | 870 | 1160 |
· Analysis | · 需求分析 (包括学习新技术) | 60 | 80 |
· Design Spec | · 生成设计文档 | 30 | 30 |
· Design Review | · 设计复审 (和同事审核设计文档) | 30 | 60 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
· Design | · 具体设计 | 180 | 240 |
· Coding | · 具体编码 | 180 | 240 |
· Code Review | · 代码复审 | 120 | 120 |
· Test | · 测试(自我测试,修改代码,提交修改) | 240 | 360 |
Reporting | 报告 | 100 | 70 |
· Test Report | · 测试报告 | 30 | 30 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 30 |
合计 | 990 | 1250 |
三、个人接口及其实现
本次项目基本任务部分共分为输入控制、核心处理、输出控制和其他(本组计划添加GUI)组成,我所负责的部分为输入控制。
任务需求为:对输入进行有效性校验,识别和处理无效输入,并针对有效输入,从中提取所需数据。
根据需求定义了如下接口:
外部接口负责和其他模块通信,调用内部子接口实现功能:
// get the content in a file and return the result
public String parseCommand(String[] args)
子接口分别完成参数处理、获取地址、获取文本内容以及对于文本内容是否为半角字符的判断:
// judge the input parameters
public int paraHandling(String[] args)
// get the address
public String getAddress(String fileName)
// get the content
public String getContent(FileReader fr, BufferedReader br, StringBuffer sb, String address)
// check half-width characters
public int halfWidthChar(String content)
下面取两个典型代码段分析(全部代码请参见GitHub源码):
这是参与外部调用的接口,主函数通过调用该接口来读取文件并获得文件内容:
// get the content in a file and return the result
public String parseCommand(String[] args) {
// initiate variables
// initiate content file, each line, filename and address to store related info
String address, content;
// initiate file reader, buffered reader and string buffer to store file medially
FileReader fileReader = null;
BufferedReader bufferedReader = null;
StringBuffer stringBuffer = null;
// call the functions to get address and then content
if (paraHandling(args) != 1)
return null; // to return a void result
else {
address = getAddress(args[0]);
content = getContent(fileReader, bufferedReader, stringBuffer, address);
if (halfWidthChar(content) == 0) return null;
else return content;
}
}
该接口结构简单清晰,因为代码已经很好地封装在了其它函数中。
在完成了必要变量的初始化之后,直接使用简单的if结构调用内部函数就能完成相应功能。
调用内部函数的顺序为:
参数判断→获取地址→获取文本→半角字符判断
下面是半角判断的函数,通过对于字符串字节长度的比较来判断文本内容是否全为半角字符:
// check half-width characters
public int halfWidthChar(String content) {
if (content.getBytes().length == content.length())
return 1;
else {
System.out.println("half-width characters only!");
return 0;
}
}
四、测试用例的设计以及测试效率的满足
本次测试用例的设计采用黑盒测试和白盒测试相结合的方式
黑盒测试通过不同的输入类型(包含输入参数对应的文本文件内容类型)来测试功能的正确性;白盒测试在尽量覆盖所有路径(函数结构比较简单,所有路径大致与下列测试用例相符)的情况下对每个路径进行参数与返回值的匹配正确性测试:
单元测试代码举例如下:
@Test
public void parseCommandTest0() throws Exception { // #0 zero-parameter test (black-box)
String[] paras = {};
System.out.println("parseCommand() Test0 started.");
assertEquals("Failed",null, cp.parseCommand(paras));
System.out.println("parseCommand() Test0 succeeded.");
System.out.println("parseCommand() Test0 finished.");
}
五、测试用例的运行截图
单个测试用例的运行截图(代码参照上述代码):
所有用例的运行截图:
可以看出,每个测试用例都通过了,意味着实际输出与预期输出相一致,测试用例的质量和源代码质量都符合要求。
(所有测试用例见GitHub: UTCaseInput.xlsx,实现见测试类源代码)
六、小组贡献分
待补充。