赞
踩
目录
1、 JUnit 是一个开源的 Java 语言的单元测试框架
二、使用@BeforeCss 和@ AfterClass 静态方法(过程)
三、@ Before 、@ After 、@ BeforeClass 、@ AfterClass 使用场景
- public class Demo01 {
- public String sum(String d,int...arg){
- int ss=Integer.parseInt(d.trim());
- int sum=0;
- for(int i=0;i<arg.length;i++){
- sum=sum+arg[i];
- }
- return sum+""+ss;
- }
- }
对于以上这个用于测试的程序而言,我们要测试它,最土的方法就是使用main函数,如下图所示:
下面我们讨论一下使用JUnit进行测试的方法:(使用eclipse)
1、首先要建立一个JUnit的测试包
2、建立测试项目:
3、选择存放目录和确定文件名
4、选择要进行测试的方法
5、使用断言和更改测试的方法的参数
6、运行结果
7、使用多个@Test测试
- @Test
- public void testSum() {
- assertEquals("125", new Demo01().sum("5", 2,4,6));
- assertEquals("127", new Demo01().sum("7", 2,4,6));
- }
-
- @Test
- public void test02() {
- assertEquals("127", new Demo01().sum(" 7", 2,4,6));
- }
8、修改主方法
- package com.dw.service
- public class Demo01 {
- public String sum(String d, int...arg){
- int ss = Integer.parseInt(d.trim());
- int sum = 0;
- for(int i = 0; i < arg.length; i++){
- sum = sum + arg[i];
- }
- return sum + "" + ss;
- }
- }
同一个单元测试内的多个测试方法:测试前都需要初始化某些对象,测试后可能需要清理资源; Junit 使用@Before和@After可以实现,在@Before方法中初始化测试资源,在@After方法中释放测试资源。
JUnit 对每个@Test 方法:(执行过程)
注意:使用@Before 和@After 可以保证:
- 单个@Test 方法执行前会创建新的 XxxTest 实例;实例变量的状态不会传递给下一个@ Test 方法。
- 单个@Test 方法执行前后会执行@ Before和@ After方法。
- import org.junit.After;
- import org.junit.Before;
- import org.junit.Test;
- public class demoTest {
-
- public DemoTest() {
- System.out.println("Demotest对象创建");
- }
-
- @Before
- public void before() {
- System.out.println("beforeTest方法执行");
- }
-
- @Test
- public void test01() {
- System.out.println("test01方法执行......");
- }
-
- @Test
- public void test02() {
- System.out.println("test02方法执行......");
- }
-
- @Test
- public void test03() {
- System.out.println("test03方法执行......");
- }
-
- @After
- public void after() {
- System.out.println("after方法执行......");
- }
-
- }
运行结果:
我们可以用@Before创建对象demo,那么每一次@test的执行都会执行@Before下的对象的创建。每一个test都是一个独立的单元,然后再使用@After销毁对象,释放资源。
注意:@BeforeClass 静态方法初始化的对象只能存放在静态字段中,静态字段的状态会影
响到所有的@Test 。
- import org.junit.AfterClass;
- import org.junit.BeforeClass;
- import org.junit.Test;
-
- public class DemoTest02 {
-
- public DemoTest02() {
- System.out.println("Demotest对象创建");
- }
-
- @BeforeClass
- public static void beforeClass() {
- System.out.println("beforeClass方法执行");
- }
-
- @Test
- public void test01() {
- System.out.println("test01方法执行......");
- }
-
- @Test
- public void test02() {
- System.out.println("test02方法执行......");
- }
-
- @Test
- public void test03() {
- System.out.println("test03方法执行......");
- }
-
- @AfterClass
- public static void afterclass() {
- System.out.println("afterclass方法执行......");
- }
-
- }
执行结果:
- beforeClass方法执行
- Demotest对象创建
- test01方法执行......
- Demotest对象创建
- test02方法执行......
- Demotest对象创建
- test03方法执行......
- afterclass方法执行......
在这个结果中,@Beforeclass和@Afterclass就只执行了一次,且@Beforeclass的执行早于@Demotest对象创建的执行。类中所有的方法或对象共享。而@Beforet和 @After是成员对象所独享的。所有@test都会共享@Beforeclass里面的内容。我们可以在@Beforeclass中申明一个对象,这个对象可以在各@Test中使用。
理解 JUnit 执行测试的生命周期
异常本身是方法签名的一部分。
public static int parselnt() throws NumberFormatException
测试错误的输入是否导致特定的异常。
- Integer.parselnt ( null );
- Integer.parselnt (“”);
- Integer.parselnt (“ xyz”);
我们可以通过 try - catch测试,但这样会写出很多这样的语句,从而使其变得复杂起
来;更好的方法就是使用 expected 测试异常,具体操作如下:
- @Test( expected = NumberFormatException.class )
- public void testNumberFormat (){
- Integer . parseInt ( null);
- //如果测试过程中抛出了以上异常,则测试通过。
- }
- public class Demo03 {
- public void testNumberFormat(String num){
- Integer.parseInt(num);
- }
-
- public void testExtends() {
- Object msg=null;
- System.out.println(msg.toString());
- }
-
- }
- import static org.junit.jupiter.api.Assertions.*;
- import org.junit.Before;
- import org.junit.jupiter.api.Test;
- import static org.junit.jupiter.api.Assertions.*;
- import org.junit.Before;
- import org.junit.jupiter.api.Test;
-
- public class Demo03Test {
-
- Demo03 d2;
-
- @Before
- public void before() {
- d2=new Demo03();
- }
-
- @Test( expected = NumberFormatException.class )
- public void testTestNumberFormat() {
- d2.testNumberFormat("abc");
- }
- //如果出现运行通过,表示出现异常。如果输入12,则运行不通过,表示没有出现异常。
-
- @Test( expected = NumberFormatException.class )
- public void testTestExtends() {
- d2.testExtends();
- }
- //空指针异常
-
- }
可以为 JUnit 的单个测试设置超时
超时设置为1秒:@Test ( timeout =1000)【 timeout 单位是毫秒】
强调:如果测试方法执行时间小于超时设置的时间,测试通过,反之不通过。
注意:超时测试不能取代性能测试和压力测试。
- public class Demo04 {
-
- public int culate() {
- int b=100;
- int sum=0;
- for(int i=1;i<=100;i++) {
- sum=sum+i;
- }
- return sum;
- }
-
- public int culate02(){
- int b=500;
- int sum=0;
- for(int i=1;i<=100;i++) {
- sum=sum+i;
- }
- try {
- Thread.sleep(1000);
- } catch(InterruptedException e) {
- //TODD Auto-generated catch block
- e.printStackTrace();
- }
-
- return sum;
- }
- }
- import static org.junit.jupiter.api.Assertions.*;
- import org.junit.Before;
- import org.junit.jupiter.api.Test;
- import org.junit.jupiter.api.Timeout;
-
- public class Demo04Test {
- Demo04 d4;
-
- @Before
- public void before() {
- d4=new Demo04();
- }
-
- @Test
- @Timeout(600)
- public void testCulate(){
- d4.culate();
- }
-
- @Test
- @Timeout(600)
- public void testCulate02() {
- d4.culate02();
- }
-
- }
如果待测试的输入和输出是一组数据,可以把测试数据组织起来,用不同的测试数据调用相同的测试方法。
- @RunWith(Parameterized.class)/
- public class Demo05Test{
-
- @Parameters
- public static Collection<?> data() {
- return Arrays.asList(new Object[][]{{0,0},{1,1}, {-1,1}});
- }
- //这是一种固定的结构,我们要做的就是改变其中的数组的参数值。其它的部分//都不能改变
-
- int input;
- int expected;
- // 参数必须要对应;
-
- public Demo05Test(int input, int expected) {
- this.input = input;
- this.expected = expected;
- }
-
- @Test
- public void Test() {
- int r=Math.abs(this.input);//绝对值
- assertEquals(this.expected, r);
- }
- //对应这三组数据会执行三次
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。