第2周个人作业:WordCount
0. 不着急,先看这里
一个讲软件测试的课程,为什么要编程?
我想说:不编程,怎么知道自己的编码可能有多少不良习惯?不先自己搞个程序出来,怎么做后面的测试?
1. 截止日期
本次作业的提交截止时间:2018年3月20日23:00。
2. 个人作业要求
作业简述:根据WordCount的需求描述,先编程实现,再编写单元测试,最后撰写博客。
2.1 WordCount需求说明
WordCount的需求可以概括为:对程序设计语言源文件统计字符数、单词数、行数,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件。
可执行程序命名为:wc.exe,该程序处理用户需求的模式为:
wc.exe [parameter] [input_file_name]
存储统计结果的文件默认为result.txt,放在与wc.exe相同的目录下。
2.1.1 基本功能
wc.exe -c file.c //返回文件 file.c 的字符数 wc.exe -w file.c //返回文件 file.c 的单词总数 wc.exe -l file.c //返回文件 file.c 的总行数 wc.exe -o outputFile.txt //将结果输出到指定文件outputFile.txt
注意:
空格,水平制表符,换行符,均算字符。
由空格或逗号分割开的都视为单词,且不做单词的有效性校验,例如:thi#,that视为用逗号隔开的2个单词。
-c, -w, -l参数可以共用同一个输入文件,形如:wc.exe –w –c file.c 。
-o 必须与文件名同时使用,且输出文件必须紧跟在-o参数后面,不允许单独使用-o参数。
2.1.2 扩展功能
wc.exe -s //递归处理目录下符合条件的文件 wc.exe -a file.c //返回更复杂的数据(代码行 / 空行 / 注释行) wc.exe -e stopList.txt // 停用词表,统计文件单词总数时,不统计该表中的单词
[file_name]: 文件或目录名,可以处理一般通配符。
其中,
代码行:本行包括多于一个字符的代码。
空 行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。
注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:
}//注释
在这种情况下,这一行属于注释行。
-e 必须与停用词文件名同时使用,且停用词文件必须紧跟在-e参数后面,不允许单独使用-e参数。
stopList.txt中停用词可以多于1个,单词之间以空格分割,不区分大小写,形如:
while if switch |
则while,if,switch作为3个停用词,在单词统计的时候不予考虑。停用词表仅对单词统计产生影响,不影响字符和行数的统计。
2.1.3 高级功能
wc.exe -x //该参数单独使用,如果命令行有该参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、单词数、行数等全部统计信息。
2.1.4 举例
wc.exe -s -a *.c
返回当前目录及子目录中所有.c 文件的代码行数、空行数、注释行数。
wc.exe -s -a –c -w *.c–e stop.txt –o output.txt
返回当前目录及子目录中所有.c 文件的字符数、单词总数、代码行数、空行数、注释行数,并将结果保存在output.txt中,且统计单词时忽略stop.txt中的单词。
2.1.5 输出结果的格式
输出结果格式形如:
[文件名], [统计标志]: [总数]
举例如下:
wc.exe –c file.c,则输出结果保存在result.txt中,内容格式如下(注意大小写):
file.c, 字符数: 50 |
wc.exe –w file.c,则输出结果保存在result.txt中,内容格式如下(注意大小写):
file.c, 单词数: 30 |
wc.exe –l file.c,则输出结果保存在result.txt中,内容格式如下(注意大小写):
file.c, 行数: 10 |
如果同时涉及多项统计,如同时需要统计字符、单词和行数,则按照字符-->单词-->行数-->代码行数/空行数/注释行的顺序,依次分行显示。显示顺序与输入参数的次序无关。例如:
wc.exe –l –c file.c,则统计file.c中的字符数和行数,输出结果保存在result.txt中,内容格式如下:
file.c, 字符数: 50 file.c, 行数: 10 |
例如:
wc.exe -s -a –c -w *.c–e stop.txt –o –output.txt
输出结果保存在output.txt中,内容格式为:
file1.c, 字符数: 50 file1.c, 单词数: 30 file1.c, 代码行/空行/注释行: 5/2/3 file2.c, 字符数: 40 file2.c, 单词数: 26 file2.c, 代码行/空行/注释行: 6/2/1 |
2.2 任务步骤说明
针对WordCount的需求,完成如下任务:
(1)分析、整理需求,提交PSP表格;
(2)编码实现,并在Github提交;
(3)设计测试用例,编写单元测试;
(4)撰写博客。
下面分别予以说明。
2.2.1 任务1:分析整理需求,完成PSP表格
该任务的主要内容是通过对2.1节的需求进行分析,整理不同层次的需求,例如,本例中可将需求划分为基本功能、扩展功能、高级功能三部分,然后,围绕需求进行任务划分,预估项目完成时间,完成PSP表格填写。(注意,程序完成后,需要再次在PSP表格中记录你在程序各模块上实际花费的时间。)
(1)PSP是什么?
PSP是卡耐基梅隆大学(CMU)的专家们针对软件工程师所提出的一套模型:Personal Software Process (PSP, 个人开发流程,或称个体软件过程)。
(2)用PSP干什么?
一个功能完备的程序不是一蹴而就的。通过将WordCount的需求划分为3个部分,可将一个大任务划分为可操作的小任务,同时最好按照任务难度或紧急程度指定各个任务的完成次序。因此,在动手开发之前,要先估计将在程序各模块开发所需耗费的时间,以及完成整个项目所需的时间,将这个[估计值]记录下来,写成PSP 的形式。
PSP的目的是:记录工程师如何实现需求的效率,和我们使用项目管理工具(例如微软的Project Professional,或者禅道等)进行项目进度规划类似。
(3)如何填写PSP?
有关PSP的更多内容,请自行阅读邹欣老师的博客:http://www.cnblogs.com/xinz/archive/2011/10/22/2220872.html。
(4)有模板吗?
PSP2.1最新表格见本文附录:PSP2.1表格。
2.2.2 任务2:编码实现,并在Github提交
使用PSP做好规划之后,第二步当然是进行编码实现,此时,除了选择合适的编程语言,还需要学会良好的源代码管理。
(1)用什么编程语言?
本次作业不限语言,推荐使用Java语言进行开发。(本次作业与下周作业具有延续性,一旦选定开发语言,中途恕不允许更换,由此带来的不便,请自行承担)
(2)什么是源代码管理?
请阅读邹欣老师的博客:源代码管理,了解源代码管理的10个实践问题。
(3)用什么进行源代码管理?
本次作业要求使用Github进行源代码管理,代码有进展即签入Github。签入记录不合理的项目会被助教抽查询问项目细节。
(4)代码签入有具体要求吗?
对代码签入的具体要求如下:根据需求划分功能后,每做完一个功能,编译成功后,应至少commit一次。本例中,至少应区分基本功能和扩展功能,即分别针对基本功能、扩展功能,编译成功后,总共至少应commit两次。具体的功能划分,请自行定义,并在任务4:撰写博客时体现出来,遵循自己对需求的功能划分来提交代码即可。
(5)代码签入有操作指南吗?
对Commit不是很熟悉的话,请阅读阮一峰的博客:Commit message 和 Change log 编写指南,了解更多细节。
(6)程序打包有什么要求吗?
所有提交到Github上的项目均需要建立一个名字为BIN的文件夹,里面必须含有可执行文件与相关的依赖库。其他要求如下:
第一,确保可执行文件的名字统一为 wc.exe。
第二,确保生成的结果文件 result.txt 与可执行文件在同一目录下,生成文件时请使用相对路径!
一个示例组织目录如下所示:
/ WCProject ( 工程名字自行指定即可 ) / *.* (放置源代码,具体目录自行处理) / BIN / *.*(exe运行需要的依赖库文件) / wc.exe / result.txt (运行exe后生成)
助教在测试时,将以命令行运行可执行文件的方式进行批量测试,参数及其约定如下:
参数名字 |
参数意义 |
用法示例 |
-c[必选] |
文件的字符数 |
示例:wc.exe -c file.c [表示返回文件file.c的字符数,并存储在result.txt中] |
-w[必选] |
文件单词总数 |
示例:wc.exe -w file.c [表示返回文件file.c的单词数,并存储在result.txt中] |
-l[必选] |
文件行数 |
示例:wc.exe -l file.c [表示返回文件file.c的总行数,并存储在result.txt中] |
-o[必选] |
输出文件名 |
示例:wc.exe –c file.c -o outfile.txt [表示返回文件file.c的字符数,并存储在outfile.txt中] |
如果使用Java语言,将Java代码打包为jar文件,并转为exe可执行文件的方法,可参考下面的博客:
a. 手把手教你如何把jar文件,打包成jar文件以及转换为exe可执行文件;
2.2.3 任务3:设计测试用例,编写单元测试
作为一门测试的课程,测试才是重点。请根据自己以往积累的测试经验,结合本周介绍的测试用例设计方法,在编码完成之后,提交产品之前,设计测试用例,并编写单元测试,对自己的项目进行测试。
(1)对测试用例有要求吗?
首先,至少应采用课程中介绍的白盒测试用例设计方法来设计测试用例,其他测试方法不限;
其次,要设计至少10个测试用例,确保你的程序能够正确处理各种情况;
最后,结合测试评估的要求,对自己的测试设计进行评价,这些测试用例能满足该程序测试的要求吗?
(2)测试用例如何记录或体现?
请在测试代码中体现所设计的测试用例,通过写注释来说明使用什么方法,设计的什么测试用例。
(3)有现成的单元测试框架或工具来写测试代码吗?
请勿使用任何单元测试框架来写测试。而是自己来规划你的测试该怎么写。考虑一下,为了更好的支持测试管理、测试独立性等,该如何设计和管理你的测试脚本。
(4)单元测试是什么?
嗯,还没了解测试方法,就开始做单元测试,确实是在考验大家。本次个人作业中,单元测试不做重点要求,只要按照第(3)条要求来写测试脚本就可以了。在下周的作业中,将强调单元测试设计和实现。有兴趣提前了解的同学,请到在线学习的第2周学习相关内容。当然,同时要推荐邹欣老师的博客:单元测试和回归测试。
2.2.4 任务4:整理工作,撰写博客
辛辛苦苦完成了作业,不写点什么对不起自己。请利用本课程中学习到的有关软件测试,和从《构建之法》中学习到的有关软件工程的相关内容,结合自己在本次个人项目中的实践经历,撰写解决项目的心路历程与收获,在班级博客的对应作业中提交。博客与Github项目明显不符的作业将取消作业成绩。
你的博客建议按照如下思路来撰写:
(1)文章开头给出Github项目地址;
(2)填写PSP表格,注意,要分别记录程序开发前预估的各模块开发时间,以及程序各模式的实际开发时间;
(3)描述解题思路。包括刚拿到题目后,如何思考,如何找资料(所有资料要求给出文献引用,附网址);
(4)程序设计实现过程。设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?
(5)代码说明。展示项目关键代码,并解释思路与注释说明。注意:不要将所有代码贴出来,且无任何解释说明;
(6)测试设计过程。测试设计包括:如何设计测试用例,哪些地方会导致程序高风险,测试代码如何设计。
(7)参考文献链接。将自己在作业完成过程中所阅读和参考的所有参考文献链接列出在博客末尾,并在对应第(2)到第(5)条的描述文字中加以引用。
博客部分内容范例:
在线学习2.3节对判定的测试中指出“语句覆盖就是要保证设计的测试用例应至少覆盖函数中所有的可执行语句”,为此,我针对WordCount类中的count方法,使用语句覆盖指标设计测试用例,共产生xx个测试用例。
2.3 附加题
完成WordCount高级功能中描述的需求。
3. 评分细则
本次作业总分55分,按照程序、博客两部分进行评分,其中,程序满分35分,博客满分20分。另有附加题两道,满分10分。具体细则如下表所示。
序号 |
评分项 |
评分子项 |
评分细则 |
满分 |
1 |
程序作业 (35分) |
源代码管理 |
通过源代码管理中的commit注释信息,增量修改的内容,是否有运行说明等给分。 |
5分 |
正确性 |
应围绕需求,满足基本的正确性要求,运行结果应正确无误(将通过标准测试集来校验)。 |
8分 |
||
注释 |
程序中应有合理、明确的注释。 |
2分 |
||
测试用例设计 |
测试用例数量不少于10个(2分),测试用例设计合理(8分),至少能结合课堂介绍的方法来设计测试用例。 |
10分 |
||
测试脚本 |
测试脚本应满足典型性、可测试性、可重现性、独立性等特性。脚本设计合理,并支持良好的测试管理。 |
10分 |
||
2 |
博 客 (20分) |
Github项目地址 |
在文章开头给出Github项目地址,地址缺失或错误均不得分 |
1分 |
填写PSP表格 |
包括程序开发前预估的各模块开发时间, 及程序各模式的实际开发时间 |
2分 |
||
描述解题思路 |
刚开始拿到题目后,如何思考,如何找资料的过程。 |
3分 |
||
程序设计实现过程 |
包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数应绘制流程图。 |
3分 |
||
代码说明 |
展示出项目关键代码,并解释思路与注释说明 |
4分 |
||
测试设计过程 |
如何设计测试用例,哪些地方会导致程序高风险,测试代码如何设计,并结合测试评估的要求,对自己的测试设计进行评价,这些测试用例能满足该程序测试的要求吗? |
4分 |
||
参考文献链接 |
作业完成过程中所阅读和参考的所有参考文献链接列出在博客末尾,并在对应第(2)到第(5)条的描述文字中加以引用 |
1分 |
||
作业改进 |
对老师和助教的点评做出了中肯的回应,包括回复评论与改进博客,可得2分; 否则,如不回应老师和助教的点评,或不改进博客,或随便敷衍老师和助教的点评(例如,“嗯嗯”“好”等),则不得分 |
2分 |
||
3 |
附加题 (10分) |
高级功能实现 |
完成WordCount的高级功能,且运行正确。 |
5分 |
多种语言实现 |
采用两种语言进行开发实现,其中一种语言开发的程序应满足1、2的程序和博客作业要求,另外一种语言开发的程序应完成WordCount的基本功能和扩展功能,且满足源代码管理的要求、和程序的基本正确性要求, |
5分 |
4. 其他注意事项
注意按时提交作业。
l 按时间完成并提交——正常评分
l 晚交一周以内——0分
l 迟交一周以上或不交——倒扣本次作业分数,即负55分
l 抄袭——按本次作业满分的两倍倒扣分数,即负110分。【严禁代码与博客等一切形式的抄袭!请各位同学千万不要触碰底线,勿谓言之不预也!】
5. 附录:PSP2.1表格
最新的PSP2.1表格如下表所示。
PSP2.1表格
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
Planning |
计划 |
||
· Estimate |
· 估计这个任务需要多少时间 |
||
Development |
开发 |
||
· Analysis |
· 需求分析 (包括学习新技术) |
||
· Design Spec |
· 生成设计文档 |
||
· Design Review |
· 设计复审 (和同事审核设计文档) |
||
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
||
· Design |
· 具体设计 |
||
· Coding |
· 具体编码 |
||
· Code Review |
· 代码复审 |
||
· Test |
· 测试(自我测试,修改代码,提交修改) |
||
Reporting |
报告 |
||
· Test Report |
· 测试报告 |
||
· Size Measurement |
· 计算工作量 |
||
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
||
合计 |
6. 致谢
本作业是参考和借鉴了邹欣老师在《构建之法》中设计的第一项个人作业(地址:http://www.cnblogs.com/xinz/p/7426280.html),北京航空航天大学罗杰老师设计的个人作业(地址:http://www.cnblogs.com/jiel/p/7545780.html),在这些作业基础上进行了修改而形成本作业,相同内容的版权归原作者所有,并在此对上述老师表示衷心的感谢。