一、JUnit4常见注解和使用方法说明
1、最常见的是@Test注解,@Test注解的方法会被当成测试用例的测试方法当测试用例执行时默认执行所有测试方法。
@Test注解可以接收两个参数。@Test(expected = NullPointerException.class,timeout = 5000)
① 第一个参数用来设置测试方法所抛出的异常,如果测试方法执行时抛出该异常或该异常的子类,则测试通过。
②第二个参数用来设置测试方法的执行时长,如果执行时间在设置的时间内执行完毕,则测试通过,该时间单位是毫秒。
2、经常用到的@RunWith()注解,@RunWith()注解修饰类,主要是用来声明测试的运行器,默认是JUnit4运行器。我们可以自己创建运行器(具体创建JUnit自定义运器 https://blog.youkuaiyun.com/u012882327/article/details/72639366)。也可使用一些框架提供的运行器,例如@RunWith(SpringJUnit4ClassRunner.class),@RunWith(Parameterized.class)等,第一个是让测试运行于Spring测试环境;第二个是进行参数化设置的。
3、其他的几个相似的注解@BeforeClass、@Before、@After、@AfterClass.
① @BeforeClass注解修饰的方法(该方法要用static修饰)会在所有方法运行前被执行,且只执行一次,通常用来为后面测试方法的准备工作,如加载配置、进行数据库的连接等。父类的@BeforeClass注解方法会在子类的@BeforeClass注解方法执行前执行。
② @Before注解修饰的方法会在每个测试方法执行前执行一次,父类@Before修饰的方法会在子类@Before修饰的方法执行前 执行
③ @After注解修饰的方法会在每个测试方法执行后执行一次,父类@After修饰的方法会在子类@After修饰的方法执行后执行。
④ @AfterClass注解修饰的方法(该方法要用static修饰)会在所有方法执行结束后执行一次,且也只执行一次,通常用来对资源 进行释放,比如数据库连接的关闭等,无论测试用例里的其他方法有没有抛出异常,该方法最终都会被执行。而且父类中 的被@AfterClass注解方法修饰的方法会在子类的@AfterClass注解修饰的方法执行之后才会被执行。
4、@Ignore注解修饰的测试类或测试方法会被忽略执行。JUnit执行结果中会报告被忽略的测试数。
5、@Rule和ClassRule注解,它们让我们可以扩展JUnit的功能,灵活改变测试方法的行为。JUnit中用@Rule和@ClassRule两 个注解来实现Rule扩展,这两个注解需要放在实现了TestRule借口的成员变量(@Rule)或者静态变量(@ClassRule)上。 @Rule和@ClassRule的不同点是,@Rule是方法级别的,每个测试方法执行时都会调用被注解的Rule,@ClassRule是类级 别的,在 执行一个测试类的时候只会调用一次被注解的Rule。具体如何利用Rule扩展JUnit。请阅读另一位博主的文章,写的 很详细 ( https://blog.youkuaiyun.com/u013001763/article/details/80256892)
6、@FixMethodOrder 是为测试方法指定执行顺序的注解,测试方法的执行顺序可通过对测试方法添加注解 @FixMethodOrder(value)来指定,其中value 为执行顺序 。
value的几种可选值:
① MethodSorters.DEFAULT **(默认)
默认顺序由方法名hashcode值来决定,如果hash值大小一致,则按名字的字典顺序确定。由于hashcode的生成和操作系统相关(以native修饰),所以对于不同操作系统,可能会出现不一样的执行顺序,在某一操 作系统上,多次执行的顺序不变 。
②MethodSorters.NAME_ASCENDING (推荐)
按方法名称的进行排序,由于是按字符的字典顺序,所以以这种方式指定执行顺序会始终保持一致;不过这种方式需要对测试方法有一定的命名规则,如 测试方法均以testNNN开头(NNN表示测试方法序列号 001-999) 。
③ MethodSorters.JVM
按JVM返回的方法名的顺序执行,此种方式下测试方法的执行顺序是不可预测的,即每次运行的顺序可能都不一样(JDK7里尤其如此)。
有不对的或者不完善的地方请大家指出,一同改进。