上一弹介绍了单元测试和单元测试框架。本期主要介绍JUnit这个目前流行的单体测试框架。JUnit是由ErichGamma和KentBeck编写的回归测试框架。Junit测试是程序员测试,也就是所谓的白盒测试,因为程序员知道被测软件是如何(How)和完成什么(What)功能的。Junit是一套框架,继承了TestCase类,可以使用Junit进行自动测试。现在很多IDE都集成了JUnit。我们在创建maven项目时,通常会自动在pom文件中添加junit依赖。junitjunittest4.4注意上面maven依赖中的scope,因为Junit只会在测试代码中使用,其中范围指定没有测试。我们直接使用和介绍JUnit4。上手JUnit,需要测试,首先要有被测试的代码(当然,基于测试编程,可以先有测试代码)。我们先看一下我们要测试的代码:publicclassCaculateService{publicfloatdivide(floatdivisor,floatdividend){returndivisor/dividend;}}我们要测试这个类,那么如何使用Junit进行测试呢?我们先写一个测试类。如果你使用的是IntelliJ+Mac,可以在类名上使用快捷键option+enter直接生成测试类,这样IDE会帮助生成对应的测试类。(其他操作系统和IDE也有同样的功能。)生成的测试代码和被测试代码的路径如下:可以看到,在一般的maven项目中,src/main下会有两个目录,java而test,源代码放在java目录下,测试代码放在test目录下。测试代码的包名和测试代码要一致。测试代码如下:publicclassCaculateServiceTest{CaculateServicecaculateService=newCaculateService();@TestpublicvoidtestDivide()throwsException{Assert.assertEquals(caculateService.divide(2,1),2.0);}}然后执行这个方法,不管Assert.assertEquals使用和结果,这里总结一下使用JUnit编写测试代码的简单步骤:创建一个名为CaculateServiceTest.java的测试类。将名为testDivide()的方法添加到测试类。在方法中添加注解@Test。执行测试条件并使用Junit的assertEqualsAPI进行检查。JUnit中的AssertpublicclassAssertextendsjava.lang.Object此类提供一组可用于编写测试的声明性方法。仅记录失败的声明方法。voidassertEquals(booleanexpected,booleanactual)检查两个变量或方程是否平衡voidassertFalse(booleancondition)检查条件是否为假voidassertNotNull(Objectobject)检查对象是否为空条件为真voidfail()使测试失败而没有报告。这些方法我就不一一介绍了。我相信我的读者可以在日常开发中理解和使用它们。比较容易理解。Assert可以用来判断方法的真实结果是否与预期结果相同。它是我们在编写单元测试时使用最多的API。JUnit中的注解@BeforeClass:对于所有的测试,只执行一次,并且必须是staticvoid@Before:初始化方法@Test:测试方法,这里可以测试预期的异常和超时@After:释放资源@AfterClass:对于所有的Test,只执行一次,必须是staticvoid@Ignore:忽略测试方法一个单元测试类的执行顺序是:@BeforeClass–>@Before–>@Test–>@After–>@AfterClass对每个测试方法的调用顺序是:@Before–>@Test–>@AfterTimeTest如果一个测试用例花费的时间超过指定的毫秒数,Junit会自动将其标记为失败。超时参数与@Test注释一起使用。现在让我们看看活动中的@test(timeout)。@Test(timeout=1000)publicvoidtestTimeoutSuccess(){//donothing}异常测试可以测试代码是否抛出了预期的异常。预期参数与@Test注释一起使用。现在让我们看看活动中的@Test(expected)。@Test(expected=NullPointerException.class)publicvoidtestException(){thrownewNullPointerException();}所有测试代码包com.hollishuang.effective.unitest.service;importorg.junit.*;/***@authorHollis17/1/7.*/publicclassJUnitTest{/***只执行一次,在整个类执行之前执行*/@BeforeClasspublicstaticvoidbeforeClass(){System.out.println("inbeforeclass");}/***只执行一次,在整个类执行之后执行executes*/@AfterClasspublicstaticvoidafterClass(){System.out.println("inafterclass");}/***每个测试方法在执行前执行一次*/@Beforepublicvoidbefore(){System.out.println("inbefore");}/***每个测试方法执行一次*/@Afterpublicvoidafter(){System.out.println("inafter");}//testcase1@TestpublicvoidtestCase1(){System.out.println("intestcase1");}//testcase2@TestpublicvoidtestCase2(){System.out.println("intestcase2");}/***测试assertEquals*/@TestpublicvoidtestEquals(){Assert.assertEquals(1+2,3);}/***testassertTrue*/@TestpublicvoidtestTrue(){Assert.assertTrue(1+2==3);}/***testassertFalse*/@TestpublicvoidtestFals(){Assert.assertFalse(1+2==4);}/***testassertNotNull*/@TestpublicvoidassertNotNull(){Assert.assertNotNull("notnull");}/***testassertNull*/@TestpublicvoidaassertNull(){Assert.assertNull(null);}/***测试失败并忽略*/@Test@IgnorepublicvoidassertFail(){Assert.fail();}/***测试异常*/@Test(expected=NullPointerException.class)publicvoidtestException(){thrownewNullPointerException();}/***测试时间*/@Test(timeout=1000)publicvoidtestTimeoutSuccess(){//donothing}/***测试时间*/@Test(timeout=1000)publicvoidtestTimeoutFailed(){while(true){}}}总结本文主要介绍JUnit的常用用法,后面会专门写一篇文章介绍如何将JUnit与Spring整合【本文为专栏作家Hollis的原创文章,作者微信公众号hollis(ID:hollishuang)】点此阅读更多该作者的好文