测试与优化
211614331 王诚荣
211614354 陈斌
单元测试
我的设计单元思路是利用JUnit4测试单元框架,创建JUnit4测试类将代码中的方法都测试一下,最后用JUnit测试套件将所有方法集中在一起测试。这次的测试任务中,我负责写了四个测试类。
-
第一个测试我将MathExam类输入的参数是否为正确创建成一个test方法,然后在test包里新建一个JUnit Test Case的testPartInput测试类,将test方法调用到这testPartInput类中,使用JUnit4的参数化测试,把我的所有测试数据和预期结果存在这个Object[]数组,然后利用参数化测试的特点,每一次从数组中取一组数据传入测试方法中,判断方法的测试结果与预期结果是否相同。如果相同,通过测试;如果不相同,测试出现Failure,就说明代码有问题,需要继续修改代码。
-
第二个测试,我将RandomQuestions类中的questionsShop()方法调用到test包中新建的testPartRQquestionsShop类中,该测试类关键代码如下:
@Test
public void testquestionsShop() {
RandomQuestions rq=new RandomQuestions();//实例化一个对象为rq
String s1=rq.questionsShop(); //将s1代表rq调用questionsShop()方法
String[] a=s1.split(" "); //先用split的将s1字符串用空格打断成数组,创建一个数组a来等于s1,存下questionsShop()方法返回的题目
int symbolNumber=0; // 定义符号的个数
int digNumber=0; // 定义数字的个数
for(int i=0;i<a.length;i++) {
if(a[i].matches("[\\+\\-\\×\\÷]")) { //利用正则表达式判断题目中有任意一个加减乘除符号,就symbolNumber+1
symbolNumber++;
}
else if(a[i].matches("\\d+")) { //利用正则表达式判断题目中有数字就digNumber+1
digNumber++;
}
}
boolean expected=true; //初始化expected预期结果为true
boolean right;
if(digNumber-symbolNumber==1) { //如果相减为1,说明产生的题目符合要求,然后把right赋值为true,再与预期结果比较
right=true;
}
else {
right=false;
}
assertEquals(expected, right); //自动判断题目是否符合要求
symbolNumber=0;
digNumber=0;
System.out.println("当前题目为: "+rq.problemSave); //人工判断题目是否符合要求
}
该测试类表示如果预期结果与实际结果相同,就测试成功,否则测试失败。
-
第三个测试我将MathExam类中的main方法调用到test包里新建的一个testMain类中,看输入参数后,整个程序能否正确运行,各个模块能否被正确调用,其中包括输入输出,输入参数,一二三年级算法等。
-
第四个测试我将所有test包里的测试类都调用到test包里的testAll测试类中,利用JUnit测试套件,运行所有测试。
测试覆盖率
结构优化
UML类图
运行流程图
心得体会
在这次的结对测试作业中,我有以下一些心得:
- 测试方法上必须使用@Test进行修饰;
- 测试类的包应该和被测试类保持一致;
- 测试单元中的每个方法可以独立测试,测试方法间不能有任何的依赖;
- 测试结果中Failure表示测试点发现了问题,也就是程序输出的结果和我们预期的不一样;
- 测试结果中error是由代码异常引起的,它可能产生于测试代码本身的问题,也可能是被测试代码中的一个BUG;
- 测试套件是组织测试类一起运行的;
- 写一个作为测试套件的入口类,这个类里不包含其他的方法;
- 更改测试运行器Suite.class
- 将要测试的类作为数组传入到Suite.SuiteClasses({})。