JUnit简介
JUnit是由Erich
Gamma和Kent Beck编写的一个回归测试框架(regression
testingframework)。JUnit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。
简单编写单元测试实例
01
|
public class JunitAnnotation
{
|
05
|
public static void beforeClass()
{
|
06
|
System.out.println( "in
before class" );
|
11
|
public static void afterClass()
{
|
12
|
System.out.println( "in
after class" );
|
18
|
System.out.println( "in
before" );
|
24
|
System.out.println( "in
after" );
|
30
|
System.out.println( "in
test" );
|
34
|
@Ignore (“unimplemented”)
|
35
|
public void ignoreTest()
{
|
36
|
System.out.println( "in
ignore test" );
|
JUnit常用注解介绍
@Test:JUnit
3.x是通过对测试方法的命名(test+方法名)来确定是否是测试,且所有的测试类必须继承TestCase。JUnit
4.x只需要在方法前加上@Test就可以定义一个测试方法。
注意:测试方法必须是public
void,即公共、无返回值的;可以抛出异常。
@Ignore:该注解标记的测试方法在测试中会被忽略。当测试的方法还没有实现,或者测试的方法已经过时,或者在某种条件下才能测试该方法(比如需要一个数据库连接,而在本地测试的时候,数据库并没有连接),那么使用该注解来标记这个方法。同时可以为该注解传递一个String的参数,表明为什么会忽略这个测试方法。比如:@lgnore(“该方法还没有实现”),在执行的时候,仅会报告该方法没有实现,而不会运行测试方法。
@BeforeClass:当我们运行几个有关联的用例时,可能会在数据准备或其它前期准备中执行一些相同的命令,这个时候为了让代码更清晰,更少冗余,可以将公用的部分提取出来,
放在一个方法里,并为这个方法注解@BeforeClass。意思是在测试类里所有用例运行之前,运行一次这个方法。例如创建数据库连接、读取文件等。
注意:方法名可以任意,但必须是public
static void,即公开的、静态的、无返回值的。这个方法只会运行一次。
@AfterClass:跟@BeforeClass对应,在测试类里所有用例运行之后,运行一次。用于处理一些测试后续工作,例如清理数据,恢复现场。
注意:同样必须是public
static void,即公开的、静态的、无返回值的。这个方法只会运行一次。
@Before:使用了该注解的方法在每个测试方法执行之前都要执行一次。主要用于一些独立于用例之间的准备工作。比如两个用例都需要读取数据库里的用户A信息,但第一个用例会删除这个用户A,而第二个用例需要修改用户A。那么可以用@BeforeClass创建数据库连接。用@Before来插入一条用户A信息。
注意:必须是public
void,不能为static。
@After:使用了该注解的方法在每个测试方法执行之后要执行一次。
@Runwith:即测试运行器,放在测试类名之前,用来确定测试类怎么运行的,当不指定这个注解时,使用默认Runner来运行测试代码,即@RunWith(JUnit4.class)。
常见的运行器有:
(1)@RunWith(Parameterized.class):参数化运行器,配合@Parameters使用JUnit的参数化功能。
(2)@RunWith(Suite.class)
@SuiteClasses({ATest.class,BTest.class,CTest.class})
测试集运行器配合使用测试集功能。
(3)@RunWith(JUnit4.class):JUnit
4的默认运行器
(4)@RunWith(JUnit38ClassRunner.class):用于兼容junit3.8的运行器
(5)一些其它运行器具备更多功能。例如@RunWith(SpringJUnit4ClassRunner.class)集成了Spring的一些功能。
@Parameters:用于JUnit的参数化功能,用来标记准备数据的方法。
注意:该方法需要满足一定的要求:
(1)该方法必须为publicstatic的
(2)该方法返回值必须为java.util.Collection类型
(3)该方法的名字不做要求
(4)该方法没有参数
参数化测试
为了保证单元测试的严谨性,我们模拟了不同的测试数据来测试方法的处理能力,为此我们编写了大量的单元测试方法。而这些测试方法大同小异:代码结构都是相同的,不同的仅仅是测试数据和期望值。为了降低代码的冗余,JUnit
4提供了参数化测试,即只写一个测试方法,把这若干种情况作为参数传递进去,一次性的完成测试。
JUnit 4参数化测试的五个步骤:
(1)为准备使用参数化测试的测试类指定特殊的运行器org.junit.runners.Parameterized。
(2)为测试类声明几个变量,分别用于存放期望值和测试所用数据。
(3)为测试类声明一个带有参数的公共构造函数,并在其中为第二个环节中声明的几个变量赋值。
(4)为测试类声明一个使用注解 org.junit.runners.Parameterized.Parameters饰的,返回值为java.util.Collection的公共静态方法,并在此方法中初始化所有需要测试的参数对。
(5)编写测试方法,使用定义的变量作为参数进行测试。
Demo如下:
01
|
@RunWith (Parameterized. class )
|
02
|
public class SquareTest
{
|
04
|
private static Calculator
calculator = new Calculator();
|
12
|
public static Collection
data() {
|
13
|
return Arrays.asList( new Object[][]{{ 2 , 4 },{ 0 , 0 },{- 3 , 9 }});
|
17
|
public SquareTest( int param, int result)
{
|
24
|
calculator.square(param);
|
25
|
assertEquals(result,
calculator.getResult());
|
打包测试
在一个项目中,只写一个测试类是不可能的,我们会写出很多很多个测试类。可是这些测试类必须一个一个的执行,也是比较麻烦的事情。鉴于此,JUnit为我们提供了打包测试的功能,将所有需要运行的测试类集中起来,一次性的运行完毕,大大的方便了我们的测试工作。具体代码如下:
2
|
@Suite .SuiteClasses({
CalculatorTest. class ,SquareTest. class })
|
3
|
public class AllCalculatorTests{
|
大家可以看到,这个功能也需要使用一个特殊的Runner,因此我们需要向@RunWith注解传递一个参数Suite.class。同时,我们还需要另外一个注解@Suite.SuiteClasses,来表明这个类是一个打包测试类。我们把需要打包的类作为参数传递给该注解就可以了。有了这两个注解之后,就已经完整的表达了所有的含义,因此下面的类已经无关紧要,随便起一个类名,内容全部为空既可。
异常测试
在JUnit 4之前,对错误的测试,我们只能通过fail来产生一个错误,并在try块里面assertTrue(true)来测试。现在,可以通过@Test注解中的expected属性来测试异常。expected属性的值是一个异常的类型。
Demo如下:
1
|
@Test (expected=ArithmeticException. class )
|
2
|
public void testDivide()
{
|
3
|
new Calculator().divide( 6 , 0 );
|
限时测试
对于那些逻辑很复杂,循环嵌套比较深的程序,很有可能出现死循环,因此一定要采取一些预防措施。限时测试是一个很好的解决方案。我们给这些测试方法设定一个执行时间,超过了这个时间,他们就会被系统强行终止,并且系统还会向你汇报该方法结束的原因是因为超时,这样你就可以发现这些Bug了。要实现这一功能,只需要给@Test注解加一个timeout属性,该注解传入了一个时间(毫秒)给测试方法,如果测试方法在指定的时间之内没有运行完,则测试失败。
Demo如下:
2
|
public void testDeathLoop()
{
|
3
|
new Calculator().deathLoop();
|
单元测试运行结果:java.lang.Exception:
test timed out after 1000 milliseconds
at test.Calculator.deathLoop(Calculator.java:25)
at test.CaculatorTest.testDeathLoop(CaculatorTest.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
…………………………
分享到:
相关推荐
eclipse上通过一个简单例子演示使用JUnit4进行测试
Junit简单教程Junit简单教程Junit简单教程Junit简单教程
ant+junit的简易教程
一共7页的word文档,详细讲解JUnit最简单的试用方法,我也正在看。2009.11.24
junit+ant教程pdf版。简单明了,代码详细,共81页。
Junit 简单 教程
junit4基础教程合集,适合初学者学习,简单明了,易于学习,希望大家能认真阅读
Eclipse Eclipse 中使用 junit junitjunit (有了开发工具对 (有了开发工具对 junit的支持后) .... ... 8 JUNIT 4.X4.X4.X使用 .... .... .... ......... 12 下载与安装 下载与安装 .... .... .... ...... 12 ...
理解手工编写单元测试的基本方法; 编写简单的基于JUnit的单元测试用例; 深入掌握JUnit的核心类、JUnit生命周期。
7页word讲解JUnit简单的TestCase测试。2009-11-24
一个简单易懂的junit教程,希望能帮上大家.
junit4的简易教程,有需要的可以下来看一下
关于Junit4的教程,简单实用。里面介绍junit4与以前版本的比较优势,一个例子来演示创建测试用例,说明一些测试框架细节,以及方便使用的参数化测试。
简单明了实用的教程,chm格式
JUnit4教程,用于java的单元测试,简单方便好用
可以通过JUnit4和JUnit5支持或以编程方式将模拟服务器作为Docker容器启动。 类似的项目有: 用法 使用Docker映像 从命令行开始: docker run -p 9090:9090 -p 9191:9191 -t adobe/s3mock 端口9090用于HTTP,端口...
软件测试 教材 教程 ppt Junit简单使用教材 代码重构 各种文档参考模版
我们看到不同层次的JUnit教程,但在本文中,我们希望更清楚地说明问题。弄清JUnit的设计思路是非常有价值的。 我们先讨论一下Junit的目标,这些目标会在JUnit的每个细小之处得到体现。围绕着JUnit的目标,我们给出...
Moco解决了开发前端时没有后端支持,开发接口时依赖没有到位的尴尬场景。 只需要简单的配置request、response等即可满足要求,支持http、https、socket。...能与其他工具集成,如Junit、Maven、Gradle等。