为什么进行单元测试?
1. 重用测试, 应付将来实现的变化.
2. 明确指定我的东西是没问题的.
Failure, error的区别?
Failure只测试失败, Error指程序本身出错
1. new ->java project: JUnit4
2. src右键->new->class T, package: com.bjsxt.junit4
package com.bjsxt.junit4; public class T { public int add(int x, int y){ return x+y; } public int divide(int x, int y){ return x/y; } }
3. 包com.bjsxt.junit4 右键-> new->package-> com.bjsxt.junit4.test ->右键-> new->JUnit test case(New JUnit 4 test, name: TTest, class under test:T)->next -> 选择要测试的T方法->finish->选择默认的myeclipse 的jar 包,
4. build path->remove ... 删除原生jar, 添加自己下载的jar, build-> add external archieves.
5. 打开TTest.java,编写测试代码:
package com.bjsxt.unit4.test; import static org.junit.Assert.assertThat; import static org.hamcrest.Matchers.*; import org.junit.Test; import com.bjsxt.u2.T; public class TTest { @Test public void testAdd() { int z = new T().add(5,3); assertThat(z,is(8));
assertThat(z, allOf(greaterThan(1), lessThan(10))); } }
keep bar green to keep bugs clean.
如果不先删除包, 会出现如下错误:
1. 使用上述is方法时提示错误, 需要引入hamcrest jar包(core和license包): 右键工程-> build path ,引入两个包
然后发现出现: java.lang.SecurityException: class "org.hamcrest.Matchers"'s signer information does not match signer information of other classes in the same package
因为hamcrest的包和junit4里的hamcrest包的classloader用的不是同一个.解决方法:
把myeclipse自带的包都去掉, 引入自己的包junit即可.
如果测试divide时出现异常怎么办?
在annotation里加入expected的异常类型即可. 后面timeout是时间的判断
@Test(expected=java.lang.ArithmeticException.class, timeout=100) public void testDivide() { int z=new T().divide(5,0); }
Annotation:
1. @Test : 测试方法
2. @Ignore: 被忽略的测试方法
3. @Before: 每个测试方法之前运行 用法: 执行方法前打开某个文件
4. @After: 每个测试方法之后运行 用法: 执行方法后关闭某个文件
5. @BeforeClass: 所有测试方法之前运行 用法: 配置工作, 建立数据库连接等费时工作
6. @AfterClass: 所有测试方法之后运行 用法: 比如关闭数据库
例子:
package com.bjsxt.junit4.test; import static org.hamcrest.Matchers.is; import static org.junit.Assert.*; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import com.bjsxt.junit4.T; public class TTest { @BeforeClass //提前配置工作, 比如数据库连接等耗费时间的资源, 搭载复杂环境时 public static void beforeClass(){ System.out.println("BeforeClass"); } @AfterClass //关闭数据库连接 public static void afterClass(){ System.out.println("AfterClass"); } @Before //打开文件使用 public void before(){ System.out.println("before"); } @Test public void testAdd() { int z=new T().add(5,3); assertThat(z,is(8)); //assertTrue("z is not bigger than 3",z>3); } //@Ignore @Test(expected=java.lang.ArithmeticException.class, timeout=100) public void testDivide() { int z=new T().divide(5,0); } @After //关闭文件使用 public void after(){ System.out.println("after"); } }
结果:
BeforeClass before after before after AfterClass
还可以新建另一个类, User:
package com.bjsxt.junit4; public class User { public String getName(){ return "songhuiqiao"; } }
在test包右键, 新建unit test, UserTest
package com.bjsxt.junit4.test; import static org.junit.Assert.assertThat; import static org.hamcrest.Matchers.is; import org.junit.Test; import com.bjsxt.junit4.User; public class UserTest { @Test public void testGetName() { assertThat(new User().getName(),is("songhuiqiao")); } }
如果两个类同时运行的话, 在test包右键, run->configuration->run all: