JUnit的概念和使用

 

 

JUnit简介

JUnit是一个开源的Java单元测试框架,JUnit4对原有的JUnit框架进行了大幅度的改进,主要目标便是利用了Java中的Annotation,来代替以前必须要继承AbstractTestCase,以及要测试的方法名称必须test为前缀。

 

JUnit4中提供了三个Annotation,用来控制整个测试的生命周期:

 

  • @Before

相当与测试用例的初始化工作,在执行每个测试用例方法时,都会先执行该方法。

  • @After

测试用例的清理工作在该方法中编写,在每个方法执行完成后,都会进行清理。

 

@Before和@After可以保证一些测试用例中的资源在这些方法执行,不会受到@Test方法执行顺序的影响。

 

  • @Test

这个是实际的测试方法,会根据该方法中的断言语句(Assert)来进行测试用例的执行结果显示输出。

 

在@Test中,还有一些属性,这些属性都是非常有用的:

  • expect=xxxx.class(extends Throwable)

如果我们在测试方法中能够预料到一些错误的发生,就使用该方法进行处理。有时候,一个函数抛出异常也许是你希望得到的结果。

 

 

  • timeout=xxxx(一个毫秒值)

如果测试方法没有在指定的timeout时间内执行完成,该测试失败,这对于单元测试效率非常有帮助。

 

如果正在实践测试驱动开发,@Ignore可以暂时忽略掉一些已经定义但并没有实现的方法。

 

JUnit中有参数化测试的概念,只需要写一个测试函数,把若干种情况当成是参数传进去,进行测试即可。

 类似下面的代码,就可以参数化的方式进行批量测试工作:

 

 


    
    
  1. @RunWith(Parameterized.class)
  2. public class BelongToRegionFunctionTestCase {
  3. private BelongToRegionFunction function;
  4. private boolean expected;
  5. private int regionId;
  6. private int parentRegionId;
  7. @Before
  8. public void setUp() {
  9. function = new BelongToRegionFunction();
  10. }
  11. @After
  12. public void tearDown() {
  13. function = null;
  14. }
  15. @Parameterized. Parameters
  16. public static Collection prepareData () {
  17. return Arrays.asList(
  18. new Object[]{ true, 15, 8},
  19. new Object[]{ true, 105, 8},
  20. new Object[]{ false, 2, 8}
  21. );
  22. }
  23. public BelongToRegionFunctionTestCase(boolean expected, int regionId, int parentRegionId) {
  24. this.expected = expected;
  25. this.regionId = regionId;
  26. this.parentRegionId = parentRegionId;
  27. }
  28. @Test
  29. public void testOldRegion() throws IOException {
  30. String filePath = this.getClass().getClassLoader().getResource( "Region-000000000000000000000008-top100-new").getFile();
  31. Assert.assertEquals(expected, function.evaluate(regionId,parentRegionId, filePath));
  32. }
  33. @Test
  34. public void testNewRegion() throws IOException {
  35. String filePath = this.getClass().getClassLoader().getResource( "Region-000000000000000000000008-top100-top100-top100-merge").getFile();
  36. Assert.assertEquals(expected, function.evaluate(regionId,parentRegionId, filePath));
  37. }
  38. }
 

 

 

 

Maven中运行JUnit

Maven本身不是一个单元测试框架,只是在构建执行到特定生命周期的时候,通过插件来执行JUnit的测试用例。这个插件就是maven-surefire-plugin,也成为Test Runner。

 

默认情况下,maven-surefire-plugin会执行测试源代码路径中的所有TestCase,路径为:src/test/java。maven中的test阶段是默认包含在一些阶段之前,也就是说package和install阶段都会默认先执行test,如果想要在package前跳过这个阶段,可以使用类似下面的命令:

 

maven package –DskipTests
    
    
  

 

如果不仅想要跳过测试运行,还需要跳过测试编译:

 

maven package –Dmaven.test.skip=true
    
    
  

 

如果在运行时某个测试用例执行失败,想要重新执行一次的时候,没有必要将所有的测试用例都跑一遍,仅需要执行部分的测试用例,maven-surefire-plugin提供了一个test参数可以让maven用户能够在命令行指定要运行的测试用例,可以使用通配符,以及加入多个Test类:

 

maven test –Dtest=Class*Test,Class2*Test
    
    
 

 在idea中可以设置工程的Test Resources Folder,这样就可以在程序中用ClassLoader的getResource得到对应资源的路径和输入流,建议不要将测试使用的资源强行防至到对应的开发资源包中。

 

maven中可以定义测试资源的路径:

 

    <build>
        <testResources>
            <testResource>
                <directory>src/test/resources</directory>
            </testResource>
        </testResources>
    </build>
 

 

Junit单元测试框架的基本使用

一、搭建环境:
导入junit.jar包(junit4)

二、写测试类:
0,一般一个类对应一个测试类。
1,测试类与被测试类最好是放到同一个包中(可以是不同的源文件夹)
2,测试类的名字为被测试类的名字加Test后缀。

三:写测试方法:
0,一般一个方法对应一个单元测试方法。
1,测试方法的名字为test前缀加被测试方法的名字,如testAddPerson()。
2,单元测试方法上面要加上@Test注解(org.junit.Test)!
3,单元测试方法不能有参数,也不能有返回值(返回void)!测试的方法不能是静态的方法。

四、测试方法的基本使用:
1,可以单独执行一个测试方法,也可以一次执行所有的、一个包的、一个类中所有的测试方法。
2,执行完后,显示绿色表示测试成功;显示红色表示测试失败(抛异常后会测试失败)。

基本原则

1.测试用例的最小化
举例 要测试功能A 其有三个子功能为A,B,C
有两种方法设计测试用例,
方法1; 用一个测试用例覆盖子功能。(一份文档)
方法2:用三个单独的用例来覆盖三个子功能(三份文档)
其中,应该选择方法2设计测试用例,因为其能覆盖的边界定义更加清晰,对产品的指向性更强,耦合度最低。
2.覆盖面广
尽可能的覆盖业务逻辑
覆盖用户场景
覆盖需求点
测试目标明确
不能具有冗余的用例
测试用例覆盖测试策略
要尽可能的覆盖基本流(核心的业务逻辑)备选流(业务分支)
使用场景
3.可判定
对于测试用例来说,要能够可判定。
4.可再现性
对于同一个测试用例来说,系统的执行结果应该是每次相同的
5.考虑优先级
根据时间不同,考虑测试用例的优先级
6.测试用例具有代表性
测试用例应该能够代表当前的业务的核心流,以及备选流
7.语言描述在准确
测试用例的语言描述要准确,要明确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值