- What is Junit?
Junit is a simple framework to write repeatable tests.It is an instance of the xUnit architecture for unit test frameworks.
xUnit 是一套基于测试驱动开发的测试框架
- how
- 测试方法上必须使用@Test进行修饰
- 测试方法必须使用public void进行修饰,不能带任何的参数
- 新建一个源代码目录来存放我们的测试代码
- 测试类的包应该和被测试类保持一致
- 测试单元中的每个方法必须可以独立测试,测试方法间不能有任何的依赖
- 测试类使用Test作为类名的后缀
- 测试方法使用test作为方法名的前缀
- attention
- 测试用例不是用来证明你是对的,而是用来证明你没有错
- 测试用例用来达到想要的预期结果,但对于逻辑错误无能为力
- Failure一般由单元测试使用的断言方法判断失败所引起的,这表示测试点发现了问题,就是说程序输出的结果和我们预期的不一样
- error是由代码异常引起的,它可以产生于测试代码本身的错误,也可以是被测试代码中一个隐藏的bug
- common annotation
- @Test 将一个普通的方法修饰成为一个测试方法
@Test(expected = XX.class)
@Test(timeout = 毫秒)
- @BeforeClass 它会在所有的方法运行前被执行,static修饰
- @AfterClass 它会在所有的方法运行结束后被执行,static修饰
- @Before 会在每一个测试方法被运行前执行一次
- @After 会在每一个测试方法运行后被执行一次
- @Ignore 所修饰的测试方法会被测试运行器忽略
- @RunWith 可以更改测试运行器 继承org.junit.runner.Runner
- test suite
- how
* 写一个作为测试套件的入口类,这个类里不包含其他的方法
* 更改测试运行器Suite.class
* 将要测试类作为数组传入到Suite.SuiteClasses({})
- junit parameter setting
- 更改默认的测试运行器为RunWith(Parameterized.class)
- 声明变量来存放预期值和结果值
- 声明一个返回值为Collection的公共静态方法,并使用@Parameters进行修饰
- 为测试类声明一个带有参数的公共构造函数,并在其中为之声明变量赋值
- some examples
public class Calculate {
public int add(int a, int b) {
return a + b;
}
public int substract(int a, int b) {
return a - b;
}
public int multiply(int a, int b) {
return a * b;
}
public int divide(int a, int b) {
return a / b;
}
}
public class CaculateTest {
@Test
public void test() {
fail("Not yet implemented");
}
@Test
public void testAdd() {
assertEquals(6, new Calculate().add(3, 3));
}
@Test
public void testSubstract() {
assertEquals(2, new Calculate().substract(5, 3));
}
@Test
public void testMultiply() {
assertEquals(4, new Calculate().multiply(2, 2));
}
@Test
public void testDivlide() {
assertEquals(4, new Calculate().multiply(2, 2));
}
}
public class CalculateTest2 {
@Test
public void testAdd() {
fail("Not yet implemented");
}
@Test
public void testSubstract() {
fail("Not yet implemented");
}
@Test
public void testMultiply() {
fail("Not yet implemented");
}
@Test
public void testDivide() {
fail("Not yet implemented");
}
}
public class AnotationTest {
@Test
public void testAdd() {
fail("Not yet implemented");
}
@Test
public void testSubstract() {
fail("Not yet implemented");
}
@Test
public void testMultiply() {
fail("Not yet implemented");
}
@Test(expected = ArithmeticException.class)
public void testDivide() {
assertEquals(4, new Calculate().divide(2, 0));
}
@Test(timeout = 2000)
public void testWhile() {
while(true) {
System.out.println("run forever");
}
}
@Ignore
@Test(timeout = 3000)
public void testReadFile() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class ErrorAndFailureTest {
@Test
public void testAdd() {
assertEquals(5, new Calculate().add(3, 3));
}
@Test
public void testSubstract() {
fail("Not yet implemented");
}
@Test
public void testMultiply() {
fail("Not yet implemented");
}
@Test
public void testDivide() {
assertEquals(3, new Calculate().divide(6, 0));
}
}
@RunWith(Parameterized.class)
public class ParameterTest {
int expected = 0;
int input1 = 0;
int input2 = 0;
@Parameters
public static Collection<Object[]> t() {
return Arrays.asList(new Object[][] {
{3, 1, 2},
{4, 2, 2}
});
}
public ParameterTest(int expected, int input1, int input2) {
this.expected = expected;
this.input1 = input1;
this.input2 = input2;
}
@Test
public void testAdd() {
assertEquals(expected, new Calculate().add(input1, input2));
}
}
@RunWith(Suite.class)
@Suite.SuiteClasses({TaskTest1.class, TaskTest2.class, TaskTest3.class})
public class SuiteTest {
}
public class TaskTest1 {
@Test
public void test() {
System.out.println("task test 1");
}
}
public class TaskTest2 {
@Test
public void test() {
System.out.println("task test 2");
}
}
public class TaskTest3 {
@Test
public void test() {
System.out.println("task test 3");
}
}