软件测试第二周作业wordcounter(代码片段)

vectorlu vectorlu     2022-10-26     125

关键词:

Github 项目地址

WordCounter in github

PSP(Personal Software Process)

PSP2.1 PSP阶段 预估耗时实际耗时(分钟) 实际耗时(分钟)
Planning 计划 10 17
Estimate 估计这个任务需要多少时间 5 10
Development 开发 545 650
- Analysis - 需求分析(包括学习新技术) 120 160
- Design Spec - 生成设计文档 60 90
- Coding Standard - 代码规范 (为目前的开发制定合适的规范) 5 10
- Design - 具体设计 30 30
- Coding - 具体编码 180 210
- Code Review - 代码复审 30 30
- Test - 测试(自我测试,修改代码,提交修改) 120 120
Reporting 报告 105 110
- Test Report - 测试报告 60 90
- Size Measurement - 计算工作量 15 20
- Postmortem & Process Improvement Plan - 事后总结, 并提出过程改进计划 30 232
合计 665 787

解题思路

由于最近事情比较多,而且之前做过的词法分析器与之有很多类似的地方,可以复用解法。目测需求可能有一定的变更,预估完成时间应该不长,较晚才开始着手 Orz。

题目解读:精确定义问题和处理方法

实际上,要做一个代码数目统计的程序也并不简单,因为要了解不同的语言的一些语法特性。要做一个能统计所有种类的代码的数量的程序,会非常麻烦。譬如下图所示,许多现代语言的字符集的支持非常丰富,而采取的编码和计数方式缤纷多彩。
技术分享图片

幸运的是,仔细阅读了老师的题目说明后——了解到老师的要求是:

一个用来检测只包含 ASCII 编码的 .c,.h 等文件的统计工具。

没有中文字符是在讨论区的答疑中看到的,故我个人目前详细定义为只包含 ASCII 编码

其中 word 的统计方法为了简化工作,采用了比较费解的统计方法——这也导致了方便检测 .sh 类的文件(其语法中很多地方不允许空格分隔),故详细定义为 .c ,.h 等文件。还有一个问题是在代码中的字符串中如果出现 \\n,而代码本身没有换行,只算作字符,那么是算作转义字符,还是算两个正常字符呢?如果需要检测其他语言,像 .py 中单引号字符串 ‘‘,双引号字符串"" 和多行字符串 """""" 是否需要支持,多行字符串是算作代码呢?还是算作注释呢?其行数又该如何定义和计算呢?

由于其他语言还涉及到一系列复杂的问题,所以我个人详细定义为只处理 .c 和 .h 文件

  1. 转义字符的问题已提交讨论区,老师说不考虑转义字符。
  2. CRLF 字符的问题已提交讨论区,已找到解决方法。

跨平台也带来一些麻烦,对于换行,Windows 使用的是 CRLF \\r\\n,而 macOS 等主流类 Unix 系统使用的是 \\n。在计算字符时应该如何处理。这些也没有在题目中详细定义。暂时只把这些问题交给 Java 本身。

最终的测试脚本,如果没有参数,或参数不合法,需要报怎样的错误提示,还是仅仅什么都不干,没有明确定义。如果我们在程序中写了提示,是否会导致老师测试失败,从而零分。

思路

基础功能

  1. 读取字符数
  2. 读取单词数
  3. 读取行数
  4. 输出文件

计数比较简单。如果不需要考虑处理字符串的问题,可以直接使用例如 aString.length() 等方法获取信息。如果需要考虑,就要便利字符串,分析计数。

扩展功能

  1. -s 需要使用递归实现文件夹的遍历
  2. -a 需要分析语法信息,用 DFA 实现
  3. -e 需要创建一个屏蔽词的数据结构,在统计 word 时跳过这些屏蔽词

代码说明

由于许多功能没有明确定义,目前看来,基础功能比较简单,就放在了一个类中 WordCounter。用各种方法来组织代码。

重要变量说明

/**
 * 基本功能的命令参数
 */
boolean requestChar = false; // -c
boolean requestWord = false; // -w
boolean requestLine = false; // -l
// -o outputFile.txt 必须成对出现
boolean requestOut = false;
String outputFileName = null;

/**
 * 扩展功能的命令参数
 */
// -s 是否需要递归处理目录下符合条件的文件
boolean requestRecur = false;
// -a 是否需要返回更复杂的数据(代码行 / 空行 / 注释行)
boolean requestMore = false;
// -e stopList.txt 是否需要提供文件,不计入单词统计
boolean requestIgnore = false;
String stopListFile = null;

// 匹配 .c & .h 文件的正则表达式
String countableFilePattern = "(\\\\w)+.[ch]";
String txtPattern = "(\\\\w)+.txt";

WordCounter wc = new WordCounter();

// 需要计算的所有文件名,支持多个文件
ArrayList<String> countFileNames = null;
// -s 支持递归查看一个文件目录下的所有文件
String folderName = null;

boolean inString = false;

依赖方法说明

/**
     * 保留的空构造方法
     */
    public WordCounter()

    /**
     * 判断是否是各种空白字符
     * @param ch
     *        The char to be tested.
     * @return @code true if @code ch is blank, otherwise @code false
     */
    private boolean isBlank(char ch) 
        if (ch==‘ ‘ || ch==‘\\t‘ || ch==‘\\n‘) 
            return true;
         else 
            return false;
        
    

    /**
     * 判断文件名是否和要求的正则表达式相匹配
     * @param filename
     *        被判断的文件名
     * @param filePattern
     *        正则匹配格式
     *        "(\\\\w)+.txt" *.txt, "(\\\\w)+.[ch]" *.c or *.h
     * @return @code true if the file can be countable by the program,
     *         otherwise @code false
     */
    private boolean isFileMatch(String filename, String filePattern) 
        // .c & .h 文件的文件名正则表达式
        Pattern pattern = Pattern.compile(filePattern);
        // 名字为空显然不匹配
        if (filename == null || filename.equals("")) 
            return false;
        
        Matcher matcher = pattern.matcher(filename);
        return matcher.matches();
    

功能方法说明

篇幅原因,只给出函数原型,详情请见源代码。

// 读取行数
private long countLine(File countF) 

// 读取单词数
private long countWord(File countW) 

// 构造 stopList 的数据结构
private Hashset<String> createStopList(String fileName)
// 按 stopList.txt 读取单词数
private long countCharWithIgnore(File countW) 

// 读取字符数
private long countChar(File countC) 

// 递归获取一个目录下的所有文件
private ArrayList<File> getAllFiles(String path) 

// 获取代码行 / 空行 / 注释行
private int[] getMoreInfo(File countM)

测试设计过程

测试原理

采用课程中介绍的白盒测试用例设计方法来设计测试用例,在测试用例说明中都有具体的体现:

  1. 精确到函数来设计用例
  2. 测试边界
  3. 路径测试
    技术分享图片

单元测试

单元测试的结构

创建单元测试函数的主要步骤:

  1. 设置数据(一个假想的正确的E-mail地址);
  2. 使用被测试类型的功能(用E-mail地址来创建一个User类的实体);
  3. 比较实际结果和预期的结果(Assert.IsTrue(target!= null);)

记录测试用例

  1. 使用易读的测试用例名,见名知意。如最小/空测试 test/testCases/empty.c
  2. 在项目的 README.md 中详细说明。如最大单文件测试,来自 Lua 语言源代码中的解析器 test/testCases/lparser.c
  3. 在项目的 commit 中也写了测试概要

程序高风险说明

  1. 读写文件权限问题,如果在类 Unix 环境下,可能无写权限,导致 IOException
  2. 递归处理文件夹问题,由于使用了递归方法处理文件夹,如果路径过深,可能导致栈溢出。
  3. 文件创建失败,或不存在异常处理等

测试用例说明

下列共 14 个测试文件,基本覆盖了所有规定的、可能的路径。

  • test
    • testCases
      • 1 emptyTest.c // 测试空文件 最小测试
      • 2 hello.c // 普通程序测试
        // 3 业界代码实况测试——Lua 语言的 parser 代码,50 KB,接近 2000 行
      • 3 lparser.c
      • 4 quoteTest1.c // 4 单独成行的注释测试
      • 5 quoteTest2.c // 5 多行代码注释
      • 6 quoteInString.c // 6 当 注释符号出现在字符串中,并不认为它是注释
      • 7 newLine.c // 7 单个空行测试
      • 8 newLines.c // 8 多个空行测试
      • 9 crlfLfF.c // 9 跨平台换行测试
      • 10 stopEmpty.c // 10 停用词表为空测试
      • 11 stopList.c // 11 停用词表非空测试
      • 12 iLegalStopList 12 非法停用词表测试
      • 13 sqllite.txt // 13 ASCII C 工业项目下载地址 SQLLite 获取一个路径下的所有文件测试
      • 14 deepRecur // 14 深目录测试

参考资料

  1. Java 白皮书 version 9 & version 10
  2. 《Java 测试驱动测试》—— 图灵出版社
  3. Java SE API
  4. 邹欣老师关于单元测试的博客




软件测试第二周作业(代码片段)

一,github地址https://github.com/lc-xie/WordCount二,PSP表格PSP2.1PSP阶段预估耗时(分钟)实际耗时(分钟)Planning计划 25 25·Estimate·估计这个任务需要多少时间 25  25Development开发200 240·Analysis·需求分析(包括学习新... 查看详情

软件质量与测试第二周作业wordcount(代码片段)

第二周作业WordCount一、Github地址https://github.com/llag9810/Software-Quality-and-Testing-Wordcount二、PSP2.1 表格PSP2.1PSP阶段预估耗时(分钟)实际耗时(分钟)Planning计划 60 25·Estimate·估计这个任务需要多少时间 30 15Dev 查看详情

软件质量测试第二周wordcount作业(代码片段)

一.github地址https://github.com/WKX121/WC二.PSPPSP表格PSP2.1PSP阶段预估耗时(分钟)实际耗时(分钟)Planning计划 25 25·Estimate·估计这个任务需要多少时间 25  25Development开发300 340·Analysis·需求分析(包括学习新技术)&... 查看详情

软件测试第二周个人作业wordcount程序实现(代码片段)

GitHub地址:https://github.com/Guchencc/WordCount一.PSP表格PSP2.1PSP阶段预估耗时(分钟)实际耗时(分钟)Planning计划  ·Estimate·估计这个任务需要多少时间 300440Development开发  ·Analysis·需求分析(包括学习新技术) 20&n... 查看详情

软件工程网络15第二周作业-提出问题(代码片段)

提出问题快速通读教材《构建之法》,并参照提问模板,提出5个问题。如何提出有价值的问题?请看这个文章:http://www.cnblogs.com/rocedu/p/5167941.html,以及在互联网时代如何提问题。还有这些要点:-在每个问题后面,请说明哪一... 查看详情

20165306课下作业(第二周)

一、教材代码完成情况测试代码链接此代码作用是求和(1~5306)。二、带包的代码编译运行测试代码链接三、课后习题p161.Person.java2.两个,Person.class和Xiti.class代码链接 查看详情

《实时控制软件》第二周作业

首先制定各个变量名称入闸传感器:sensor_in;出闸传感器:sensor_out;起落杆上升:gan.raise();起落杆下降:gan.down();信号灯:light(1为绿,0为红);通行状态:A0为禁止通行,A1为允许通行;竖着写(在状态中判断事件)C代码片段cur_st... 查看详情

第二周作业wordcount(代码片段)

https://github.com/HuangDongPeng/WordCount.git1.1 PSPPSP2.1PSP阶段预估耗时(分钟)实际耗时(分钟)Planning计划 30 30·Estimate·估计这个任务需要多少时间 5h 12hDevelopment开发 2h 4h·Analysis·需求分析(包括学习新技 查看详情

第二周个人作业(代码片段)

 1.GitHub地址:https://github.com/YJG1997/wc2.psp表格PSP2.1表格PSP2.1PSP阶段预估耗时(分钟)实际耗时(分钟)Planning计划 60 50·Estimate·估计这个任务需要多少时间 30 20Development开发 60 90·Analysis·需求分析(包括学... 查看详情

第二周个人作业wordcount(代码片段)

一、GitHub地址https://github.com/JasonLiu1105/WordCount二、PSP表格PSP2.1PSP阶段预估耗时(分钟)实际耗时(分钟)Planning计划 20 20·Estimate·估计这个任务需要多少时间 2days 3daysDevelopment开发 1day 1day·Analysis·需求 查看详情

第二周作业wordcount(代码片段)

github项目链接https://github.com/liqia/WordCount1.项目简介对程序设计语言源文件统计字符数、单词数、行数,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件。可执行程序命名为:wc.exe,该程序... 查看详情

《实时控制软件设计》第二周作业

 状态分析由题目描述,只有两种不同事件,一个是车辆进入,一个是车辆离开,与之对应的传感器信号,起落杆信号,通行灯信号都是一同变化,因此可以简化成两种复合状态。 代码实现 传感器头文件////Createdbyzhuha... 查看详情

第二周作业

先测试车辆的进入与进出,定义升起和落下的杆,通过杆的状态不同亮的灯也不一样,在判断车辆有无出入。代码主函数:#include"./head.h"#include<iostream>usingnamespacestd;intmain(){   GurdSystemgs;      &... 查看详情

2017-2018-220179202《网络攻防技术》第二周作业(代码片段)

一、黑客信息袁仁广,中国国家信息安全漏洞库特聘专家,北京奥运会特聘信息安全专家,现任腾讯湛泸实验室负责人。其领衔的360漏洞研究实验室被誉为“东半球最强大的白帽子军团”。他在windows系统方面的造诣,在国内应... 查看详情

软件工程第二周作业----词频统计

实验要求:统计文件中出现过的单词数目,并按数目和字典顺序排序,将结果输出到指定文件中。需要统计单词的文件名从命令行输入。 实验分工:代码编写&测试:张文杰博客编写:朱昱青 实验思路:1.在主函数中... 查看详情

第二周作业一读软件工程

谢谢邹老师给我们带来这么精彩的书,话不多说,强行提问:1.不面向用户的软件,程序员自娱自乐的项目,如何选择开发模式。2.结对编程后,由此可能造成的损失和不了后果由两人承担,具体比例怎么算。3.像微软office办公软... 查看详情

程序语言与编程实践5-;java实操2|第二周作业及思路讲解|基础知识强化考察(代码片段)

Java的第二周作业的思考总结,涉及的只是有static代码块的输出次序,面向对象的编程实战,字符串的拼接等java基本的关键的内容。是这样的,Java这门课没有给线上实验评测平台(我还专门上平台上看了看),第一周作业出得挺... 查看详情

软件工程作业第二周--例行报告

类型任务开始结束中断deltacoding重定向/输入/输出的代码9.16晚上6点9:16晚上八点半--150mincoding文件夹读文件/控制台直接读/整合9.17早上9点9:17晚上七点12点午饭/午睡到4点/晚饭,12点-4点以及五点到五点半330min安装装Git,试... 查看详情