在C和C++中都有assert关键,Java中同样也有,在java中,assert关键词是从JDK1.4引入的。Junit4使用org.junit.*包而Junit3.8使用的是Junit.framework.*包。
1. 什么是断言?
assert 关键词,表示断言,assertion是用于调试、测试的方式。
编写代码是,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设 可以将断言看作是异常处理的一种高级形式
2. 断言有什么作用?
断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真 可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新起用断言。
3.为什么要用断言?
在实现中,assertion就是在程序中的一条语句 ,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的争取性。单元测试必须使用断言(Junit/JunitX)
4.何时需要使用断言?
4.1在开发中是一种常用的调试方式。可以在预计正常情况下程序不会到达的地方放置断言。断言只有是false就会停下来,而不会继续执行,跟异常不一样。
4.2 断言可以拥有检查传递给私有方法的参数。(对于公有方法,因为是提供给外部的接口,所以必须在方法中有相应的参数检验才能保证代码的健壮性)
5.什么地方不要使用断言?
断言语句不是永远会执行,可以屏蔽也可以启动。
5.1.不要使用断言作为公共方法的参数检查,公共方法的参数永远都要执行
5.2.断言语句不可以有任何边界效应,不要使用断言语句去修改变量和改变方法的返回值
@BeforeClass 标签注释的方法用于在整个类测试过程的初始化后调用一次。
@AfterClass 标签注释的方法则是整个测试类结束之前调用一次。这2个标间的搭配可以避免使用@Before\@After标签组合在每个测试方法前后都调用的弊端,减少系统开销,提高系统测试速度。(不过对黄金独立性的测试还是应当使用@Before/@After来完成)
@Test 标签用例标注待测试的方法,按照类中的顺序执行。
例:
@RunWith(Suite.class)
@SuiteClasses({MathTest.class,MathTestAnother.class})
Public class Util4Suite{
}
通过@RunWith和@SuiteClasses 标签来注释一个空的包汗无参数构造函数的类来作为套件类,将需要组成套件运行的类加到@SuiteClasses的属性中即可。
@BeforeClass和@AfterClass @Before和@After 在每个类中只有一个方法能被注解。多个方法能被注解,但其执行的顺序未特别指定,且不运行重载方法。 方法名是不相关的方法名是不相关的 每个类运行一次在每个测试方法运行前或运行后运行 在当前类的@BeforeClass方法运行前先运行超类的@BeforeClass方法。在超类中声明的@AfterClass方法将在所有当前类的该方法运行后才运行。 超类中的@Before在所有子类的该方法运行前运行。在超类中的@After在在所有子类的该方法运行后才运行。 必须是公共和非静态的。必须是公共和非静态的。 即使一个@BeforeClass方法抛出一个异常,所有的@AfterClass方法也保证被运行。即使一个@Before或者@Test方法抛出一个异常,所有的@After方法也保证被运行。
如果你仅有一次需要分配和释放昂贵的资源,那么@BeforeClass和@AfterClass可能很有用。在我们的例子中,AbstractParent使用这些在startTestSystem()和stopTestSystem()方法上的注解启动和停止整个测试系统。并且它使用@Before和@After初始化和清除系统。子类AdvancedTest也混合使用这些注解。
JUnit 4 常用的几个annotation 介绍
★ @Before:初始化方法,在任何一个测试执行之前必须执行的代码;
★ @After:释放资源,在任何测试执行之后需要进行的收尾工作。在每个测试方法执行之后执行一次,该annotation只能修饰public void 方法;
★ @Test:测试方法,表明这是一个测试方法。在Junit中将会自动被执行。该annotation只你呢个修饰public void 方法。对于方法的声明也有如下要求:名字可以随便取,没有任何限制,但是返回值必须为void,而且不能有任何参数。如果违反这些规定,会在运行时抛出一个异常。至于方法内该写些什么,那就要看你需要测试些什么了;在这里可以测试期望异常和超时时间,如 @Test(timeout = 100),我们给测试函数设定一个执行时间,超过了这个时间(100毫秒),它们就会被系统强行终止,并且系统还会向你汇报该函数结束的原因是因为超时,这样你就可以发现这些Bug了。
★ @Ignore:忽略的测试方法,标注的含义就是“某些方法尚未完成,暂不参与此次测试”;这样的话测试结果就会提示你有几个测试被忽略,而不是失败。一旦你完成了相应函数,只需要把@Ignore标注删去,就可以进行正常的测试。
★ @BeforeClass:针对所有测试,只执行一次,且必须为public static void;
★ @AfterClass:针对所有测试,将会在所有测试方法执行结束后执行一次,且必须为public static void;