题目:我们假设我们要写一个整数除法的类,并且给他写测试用例。

结对分工:滕娟负责写代码,搜集资料,整理,潘广玫负责进行测试,处理测试结果

github地址链接: https://github.com/luhan420/jiedui/tree/master

结对人地址链接:http://www.cnblogs.com/tj1024/p/4490680.html

测试情况

一.单元测试规范

单元测试使用Junit4进行测试,Eclipse内置了Junit4的支持。

1) 测试类命名

在项目的DAO与service层的实现类都必须编写测试用例,action由于struts2.0支持测试,所以也应该测试:

1. 测试用例命名规则为: 类名 + Test。(junit4支持非这样的命名方式,但是为

了统一管理,还是采用这样的方式命名)

2. 建立一个和src平行的test包,所有测试用例都放在相应的包内,便于统一管

理,合成测试套件。

3. 同一个包的测试用例,合成一个测试套件。

4. 整个工程的测试套件,合成一个统一的测试套件。

2) 测试用例的编写

1. 测试方式都是test开头的方法(testXXXX),JUnit按照在测试用例中的顺序执

行。测试方法可以和被测试的方法一一对应,测试方法也可以包含多个被测试的方法。

2. 测试方法中,使用断言(assertXXX和fail,详细资料请查阅JUnit文档)来进行

测试结果判断,也可以辅以文字打印说明,如果测试程序抛出异常,则显示为错误,如果断言失败,则显示故障。

3. 测试用例必须覆盖被测试类、方法的所有功能,包括正常情况、异常情况和发

生错误的情况都必须覆盖,才能保证测试的完整性。

3) 测试数据的准备

为了防止数据库的更改对测试结果的影响,测试数据由统一的sql脚本来创建,测试前执行一下脚本创建数据。也可以使用数据回滚的方式进行与数据相关的测试。

4) 实体层的测试

由于本次项目的Entity model由之前的贫血模型改为到充血模型,所以对于Entity的测试不能够再忽略,对于Entity自身的除set/get以为的方法都应该进行单元测试。

5) DAO层的测试

每一个DAO类都必须编写测试用例,对DAO的每一个公开方法进行测试,测试用例必须使用有代表性的测试代码,覆盖的所有可能的输入和输出情况,包括创建,更改,删除对象以及输入错误数据等测试。

6) Service层的测试

Service层的测试必须测试Service对象是否满足功能要求,事务完整性等功能。

7) Struts层和浏览器层的测试

待定…

二.Eclipse中JUnit的用法

这里不详细介绍JUnit的用法,详细的用法自己找文档进行学习。

下面举一个简单的例子说明Eclipse中JUnit的用法:

我们假设我们要写一个整数除法的类,并且给他写测试用例:

1) 建立Math类

/** 

 

* @创建时间:May  9,2015 

 * @描述:  */ 

public class Math {  

 

public static int divide(int x,int y) {        return x/y; 

      } 

  

 public static int multiple(int x,int y) {        return x*y;       

}

2) 建立测试用例

选中需要建立测试用例的包,选择new->other。

这里main方法不需要,我们可以直接用IDE进行测试。 setUp()方法在测试方法前调用,一般用来做测试准备工作。 tearDown()方法在测试方法后调用,一般作测试的清理工作。

setUpBeforeClass()方法在整个类初始化之后调用,一般用来做测试准备工作。 tearDownAfterClass()方法在整个类结束之前调用,一般作测试的清理工作。 constructor()为是否包含构造方法。

选择下一步:

选择需要测试的方法,完成。

系统生成以下代码

/** 

 

* @创建时间:May 9, 2015

 * @描述:  */ 

public class MathTest {   @BeforeClass 

 public static void setUpBeforeClass() throws Exception {  } 

  @AfterClass 

 public static void tearDownAfterClass() throws Exception {  } 

  @Test 

 public void testDivide() {   fail("Not yet implemented");  } 

  @Test 

 public void testMultiple() {   fail("Not yet implemented");  

 } 

 }

说明:

@BeforeClass标签注释的方法用于在整个类测试过程的初始化后调用一次,@AfterClass标签注释的方法则是整个测试类结束之前调用一次。这2个标间的搭配可以避免使用@Before、@After标签组合在每个测试方法前后都调用的弊端,减少系统开销,提高系统测试速度。(不过对环境独立性的测试还是应当使用@Before、@After来完成)

@Test标签用来标注待测试的方法,按照类中声明的顺序执行。

我们在testDivide方法加入测试代码,分别测试三种情况:

a. 完全正确也没有可能出错的数据,如:9除3  结果必须等于3 b. 可能有问题的边缘数据,如:10除3 结果也必须等于3 c. 错误的数据,如:10除0 必须抛出异常 忽略testMultiple方法 代码如下:

@Test(expected=ArithmeticException.class)  public void testDivide() {   assertEquals(3,Math.divide(9,3));   assertEquals(3,Math.divide(10,3));   Math.divide(10,0); //除数不能为0,会抛出异常

}

@Ignore("忽略乘法测试")

@Test

public void testMultiple() {

}

说明:

Junit4为测试方法增加了判断异常的方式,避免了以前还要通过try/catch块捕捉异常再抛出的复杂方式,简单的这样声明“@Test(expected=ArithmeticException.class)”

Junit4就会检查此方法是否抛出ArithmeticException异常,如果抛出则测试通过,没抛出则测试不通过(@Test标签还有一些其他参数,例如超时测试,但是由于并不能准确反应实际时间,所以应用较少)

@Ignore标签会告诉Junit4忽略它所标注的方法,例如数据库不可用时可以用此标注标注一些测试数据库连接的方法来避免测试失败。

3) 运行测试

或者

系统会打开JUnit透视图,如果测试全部通过,则显示如下,颜色条为绿色:

我们将assertEquals(3,Math.divide(9,3));改成assertEquals(2,Math.divide(9,3));则显示如下,颜色条为红色:

可以对错误或者故障的地方进行追踪。

4) 创建测试套件

测试套件可以将多个测试用例合在一起测试,将相关的测试用例合成一个测试套件,在做一个修改后,只需要运行测试套件就可以,不需要运行每一个测试用例。  Junit4没有采用以前的套件测试方法,同样使用annotation的方式来进行。简单在你所要构建测试套件的包里创建一个文件,一般以包名+4Suite

下面我在上面的测试包中复制一下之前的测试类并且一个改名字叫做MathTestAnother,新建一个class类叫做Uitl4Suite,代码如下:

package org.bj.util; 

import org.junit.runner.RunWith; import org.junit.runners.Suite; 

import org.junit.runners.Suite.SuiteClasses; /** 

  * @创建时间:May 9, 2015  * @描述:  */ 

@RunWith(Suite.class) 

@SuiteClasses({MathTest.class,   

 

  MathTestAnother.class}) 

public class Util4Suite { 

 }

说明:

通过@RunWith和@SuiteClasses标签来注释一个空的包含无参数构造函数的类来作为套件

类,将需要组成套件运行的类加到@SuiteClasses的属性中即可。

运行正确后的结构如图:

可以看到运行套件类的结果是2个测试类都进行了测试。

5) 参数测试

修改 testMultiple 

//@Ignore("忽略乘法测试")  @Test 

 

public void testMultiple() {   

 

assertEquals(result,Math.multiple(faciend,multiplicator)); 

 

}

编写参数方法:

@Parameters 

 public static Collection multipleValues() {   

return Arrays.asList(new Object[][] {   

 {3, 2, 6 },   

 {4, 3, 12 },    

{5, 7, 35 },    

{6, 7, 42 },   

 {11, 7, 77 },    

{25, 4, 100 },    

{34, 3, 102 },    

{21, 5, 105 },    

{11, 22, 242 },    

{8, 9, 72 }});  

}

说明:

需要使用@Parameters标签注解一个静态的返回集合对象的方法

增加成员变量和构造函数:

int faciend; 

 int multiplicator; 

 int result; 

  public MathTest(int faciend, int multiplicator, int result) {    

this.faciend = faciend; 

 this.multiplicator = multiplicator;   

 this.result = result; 

}

说明:

注意类型要匹配好,不要搞错了

最后在给测试类增加如下注释:

@RunWith(Parameterized.class)

测试看看,结果如下:

成功运行了9次。

心得:

这次的软工任务既不是单打独斗的个人任务,也不是集思广益的团队项目,而是人数为两人的结对编程。经过这几天的努力,终于把这个整数除法的类,并且给他写测试用例完成了。虽然还有很大的改进空间,但这是目前我们能够达到的最好水平了。在这期间,我们结对编程的两个人互相帮助、互相支持、互相学习,在实践中共同进步。不仅体验了结对编程的效率,同时也加深了对C#、面向对象等的理解。可以说这个任务使我们二人受益匪浅。一个人使用键盘编写代码,另一个人在一旁能够及时的发现和改正错误,这样下来能够发现不少一个人工作时发现不了的低级错误。而且,两个人结对编程时,可以随时进行讨论,当有概念模糊或是思路不清晰的时候,可以迅速寻求同伴的帮助,两个人慢慢理清思路,理清逻辑,这样的效率不是一个人工作时可以相比的。而且,两个人时还可以相互督促,能够更加全身心的投入,而且互相都能够学到很多东西。总之,结对编程使我俩都受益匪浅。

结对项目junit测试用例的更多相关文章

  1. 系统分析与设计结对项目——WordCount

    结对项目完成WordCount 合作者:201631062507  201631062526(学号) 代码地址:https://gitee.com/WordCountMC/WordCountTeam ...

  2. 高级四则运算器—结对项目反思(193 & 105)

    高级四则运算器—结对项目反思(193 & 105) 本周我和一位韩国同学(71061105)一起结对编程完成了我们的结对项目——高级的小学四则运算题目生成器. PSP表格   PSP2.1 P ...

  3. 结对项目——四则运算GUI项目

    一.项目地址:https://git.coding.net/lvgx/wsz.git 二.PSP: PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min) Plannin ...

  4. 结对项目:ATM

    一:结对项目名称:ATM 二:源代码及单元测试代码网址链接:https://github.com/tpp531853660 三:结对人的博客链接:http://www.cnblogs.com/Joan ...

  5. 结对项目——Core设计与实现

    写在前面:关于结对编程 结对编程我一直认为是一种非常好的合作方式,他的形式主要是由一个人负责代码编写,另一个人则在一旁即时对写下的代码进行审查,这样可以大大减少代码实现方面的错误. 这次我的结对伙伴是 ...

  6. Junit测试用例

    一.题目简介 返回一个给定整数参数的绝对值. 二.源码的github链接 https://github.com/liyan941016/test/blob/master/FileTest.java h ...

  7. [BUAA_SE_2017]结对项目-数独程序扩展

    结对项目-数独程序扩展 Runnable on x64 Only sudoku17.txt 须放置在可执行文件同目录中,可移步以下链接进行下载 Core-Github项目地址 GUI-Github项目 ...

  8. 小学四则运算结对项目报告【GUI】

    写在前面 这次的结对项目我做了很长时间,感触也很多.在这次项目中我使用了Java GUI作为和用户的交互方式,但是在上Java课的时候我对GUI和事件驱动这里并没有学的多好,可能是当时对编程还没有什么 ...

  9. 结对项目-小学生四则运算系统(GUI)

    Coding克隆地址:https://git.coding.net/FrrLolix/CalGUI.git 伙伴博客:http://www.cnblogs.com/wangyy39/p/8763244 ...

随机推荐

  1. February 6th, 2018 Week 6th Tuesday

    To be is to be perceived. 存在即被感知. How to interpret this quote? Maybe it means that everything in you ...

  2. <20180929>任性的甲方

    今天参观了朋友在监督的新项目, 这个项目周期大概在6到9个月,预计本年度11月竣工. 总共大楼有五层, 施工面积在一万平米左右. 位于三楼的机房使用的设备有点高大上,发上来鉴赏一下. 双专线, 第二条 ...

  3. 兼容IE8及以上的常用css选择器

    p~ul//位于p元素后边的ul div>p div+p//紧接在 <div> 元素之后的所有 <p> 元素 [attribute]//[target]选择带有 targ ...

  4. Webserver管理系列:6、网络和共享中心的安全配置

    1.关闭网络发现 2.关闭文件和打印机共享 3.关闭公用目录共享 4.启用password保护共享

  5. [WC2011]最大XOR和路径

    嘟嘟嘟 不愧是WC的题,思维真的很妙(虽然代码特别简单). 首先暴力找出所有路径肯定不行. 题中说可以经过重复的边,并且边权也会被计算多次.那么就是说,如果经过一条边再沿这条边回来,这条边的贡献就是0 ...

  6. vue-cli 如何打包上线

    以vue创建的官方例子为例子,我们在开发环境的时候会 npm run dev ,生成 而想要打包成一份很简单, 只需要 npm run build 这个命令 这两种命令的配置文件在config的ind ...

  7. Myeclipse 启动报错 Failed to create the java Virtual Machine

    1.找到Myeclipse的安装目录 2.找到myeclipse.ini文件 3.打开myeclipse文件 你把原来的jvm.dll文件路径配置改成你的jdk安装路径中的jvm.dll路径 即: C ...

  8. 按行读取.txt文件,并按行写入到新文件中

    package com.test.io; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.Fi ...

  9. warning: ISO C++ forbids converting a string constant to 'char*'

    第1种字符串赋值方式: char * fileName="./2017-09-02-10-34-10.xml";//这一种字符串赋值方式已经被ISO禁止了 第2种字符串赋值方式: ...

  10. AI 循环神经网络(RNN)

    循环神经网络(Recurrent Neural Network,简称RNN),通常用于处理序列数据.正如卷积神经网络通常用于处理网格数据(例如图像)一样. 1.展开计算图 输入.输出.记忆 权值 2. ...