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

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

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. EasyUI DataGrid自适应高度

    我的页面分为上下两部分,但发现下面有DataGrid的高度总是自动改,数据根本显示不出来. 后来在博客园里看到这个:http://www.cnblogs.com/xienb/archive/2013/ ...

  2. node及socket.io实现简易websocket双向通信

    技术栈: vue2.0 + node + websocket( socket.io ) 1. 安装依赖 初始化vue项目后输入下方指令安装依赖包 // 推荐cnpm安装 npm i vue-socke ...

  3. HTML元素 - input type=hidden

    定义 传输关于客户/服务器交互的状态信息. Transmits state information about client/server interaction. 注释 这种输入类型用户无法控制,但 ...

  4. dp HDU - 5074

    按题意推表达式 #include<cstdio> #include<cstring> #define max(a, b) (a)>(b)?(a):(b) ][], num ...

  5. YOLO2(1)配置安装win10+openvc2413+VS2013 简单测试官例

    参考官网 https://github.com/AlexeyAB/darknet#how-to-compile-on-windows https://github.com/AlexeyAB/darkn ...

  6. Linux 性能分析工具汇总合集

    出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章.本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面.如果没有完善的计算机系统知识,网络知识和操作系统知识, ...

  7. nginx反向代理导致请求header头信息丢失

    背景:前端与后端调试接口,后端拿不到前段发过去的请求头信息,导致接口不通.(但是在本地是可以拿到的) 原因:nginx做了反向代理,没有请求时候加头信息的配置 报错如下: 解决方法: 方法一:NGIN ...

  8. jmeter(二十)阶梯式加压测试

    性能测试中,有时需要模拟一种实际生产中经常出现的情况,即:从某个值开始不断增加压力,直至达到某个值,然后持续运行一段时间. 在jmeter中,有这样一个插件,可以帮我们实现这个功能,这个插件就是:St ...

  9. 看think in java 随笔

    java的方法是运行期动态绑定上去的,可以根据自己真正实例化的类来判断调用哪个方法,比如子类重写了父类方法,会调用子类方法. 而利用final关键字可以让方法不能重写,就可以在编译期就绑定,这样就可以 ...

  10. Spark笔记-DataSet,DataFrame

    DataSet:面向对象的,从JVM进行构建,或从其它格式进行转化 DataFrame:面向SQL查询,从多种数据源进行构建,或从其它格式进行转化 RDD DataSet DataFrame互转 1. ...