软件工程知识点

用例设计很麻烦,每个都要考虑

第一个Junit测试程序,通过assert判断测试。

package step1;

import org.junit.Test;
import static org.junit.Assert.assertEquals;
import step1.JunitSub;

public class JunitSubTest {
     //引入JunitSub对象
     JunitSub js = new JunitSub();
     int sub = js.sub(5,2);
     int testSub = 3;

     /*
     请在下面的Begin/End内写一个测试函数,
     来验证JunitSub中的sub函数编写是否正确
     */
     /***********************Begin**************************/
     @Test
     public void testSub(){
          assertEquals(sub,testSub);
     }

     /************************End***************************/

}


通过Before和After能实现很多顺序功能

package step2;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;

public class JunitAnnotation {
    /*
     *以下Junit测试程序的输出结果为:
     *in before class
     *in before
     *in test
     *in after
     *in after class
     *请修改下面Begin/End内各个测试函数的注解,使输出结果逆序
     */
     /***********************Begin**************************/



   //execute before class
   @AfterClass
   public static void beforeClass() {
      System.out.println("in before class");
   }

   //execute after class
   @BeforeClass
   public static void  afterClass() {
      System.out.println("in after class");
   }

   //execute before test
   @After
   public void before() {
      System.out.println("in before");
   }

   //execute after test
   @Before
   public void after() {
      System.out.println("in after");
   }

   //test case
   @Test
   public void test() {
      System.out.println("in test");
   }
    /************************End***************************/
}

给定一个断言测试类AssertionsTest.java,请按要求补全代码,写出相应的断言测试。

1.断言obj1和obj2相等;
2.断言obj3和obj4指向完全相同的对象;
3.断言obj2和obj4指向不同的对象;
4.断言obj1对象不为空;
5.断言obj5对象为空;
6.断言var1小于var2;
7.断言arithmetic1和arithmetic2两个数组相等。

package step3;

import static org.junit.Assert.*;
import org.junit.Test;

public class AssertionsTest {
	String obj1 = "junit";
	String obj2 = "junit";
	String obj3 = "test";
	String obj4 = "test";
	String obj5 = null;
	int var1 = 1;
	int var2 = 2;
	int[] arithmetic1 = { 1, 2, 3 };
	int[] arithmetic2 = { 1, 2, 3 };

	@Test
	public void test() {

		//请在下面的Begin/End内写添加断言测试的代码,不要改动其他地方的代码
		/***********************Begin**************************/
        assertEquals(obj1,obj2);
        assertSame(obj3,obj4);
        assertNotSame(obj2,obj4);
        assertNotNull(obj1);
        assertNull(obj5);
        assertTrue(var1 < var2);
        assertArrayEquals(arithmetic1,arithmetic2);

		/************************End***************************/
    }
}

还有oj更常用的超时测试

package step4;


import org.junit.Test;


public class TestTimeOut {

     //请在下面的Begin/End内补全test()超时测试函数,要求如果超过1000毫秒执行未结束,就判定测试未通过
    /***********************Begin**************************/
    @Test(timeout=1000)
    public void test() {
        while(true){}
    }
    /************************End***************************/
}

还可以进行参数化测试

package step1;

import static org.junit.Assert.assertEquals; //静态导入
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import step1.Calculator;
/**
 * JUnit4的参数化测试
 */
@RunWith(Parameterized.class)
public class ParameterTest {
    private int input11;
    private int input22;
    private int expected;
    public ParameterTest(int input11, int input22, int expected){
        this.input11 = input11;
        this.input22 = input22;
        this.expected = expected;
    }

    @Parameters
    public static Collection prepareData(){
        /**
         *该二维数组的类型必须是Object类型的
         *该二维数组中的数据是为测试Calculator中的sub()方法而准备的
         *该二维数组中的每一个元素中的数据都对应着构造方法ParameterTest()中的参数的位置
         *所以依据构造方法的参数位置判断,该二维数组中的第一个数减去第二个数等于第三个数
         *请在Begin/End内补全代码,要求为单元测试传递4组参数,来验证Calculator中的sub函数编写是否正确
         *提示!:只需要2行代码
         */
        /*********************************Begin*************************************************/
        Object [][] bject = {{-1,-2,1},{0,2,-2},{-1,1,-2},{1,2,-1}};  
        return Arrays.asList(bject);  

        /**********************************End**************************************************/

    }
    @Test
    public void testSub(){
        Calculator cal = new Calculator();
        assertEquals(cal.sub(input11, input22), expected);
    }
}

还可以异常捕获:
Person类代码如下:

//Person.java
public class Person {  
        private String name;  
        private int age;  
        public String getName() {  
        return name;  
        }  
        public void setName(String name) {  
        this.name = name;  
        }  
        public int getAge() {  
        return age;  
        }  
        public void setAge(int age) {  
        if (age < 0 ) {  
        throw new IllegalArgumentException("age is invalid");  
        }  
    this.age = age;  
    }  
}  

测试类

package step2;
import static org.junit.Assert.*;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import step2.Person;



public class JunitException {

    /**
     *请在Begin/End内加一行注解,要求检查Person对象的年龄是否合法,不合法则
     *抛出IllegalArgumentException异常
     */
    /************************************Begin**********************************************/
    //要求检查Person对象的年龄是否合法,不合法则抛出IllegalArgumentException异常
    @Test(expected = IllegalArgumentException.class)        

    /************************************End************************************************/

    public void checkage() {
    Person person = new Person();
    person.setAge(-1);

    }
}

还有很简单的集成测试,把两个@紧紧地放在类前面
类代码:

//Car.java
public class Car {  
    public int getWheels() {  
        return 4;  
    }  
}
//Rectangle.java
public class  Rectangle{  
    public int getArea(int width,int height){  
        return width*height;  
    }  
}  

测试类代码:

//CarTest.java
public class CarTest {  
    Car car;
    @Before  
    public void setUp() throws Exception {  
        car = new Car();  
    }
    @Test  
    public void testGetWheels() {  
        int result = car.getWheels();  
        assertEquals(4, result);  
    }
}  
//RectangleTest.java
public class RectangleTest {  
    Rectangle rectangle;  
    @Before  
    public void setUp() throws Exception {  
        rectangle=new Rectangle();  
    }
    @Test  
    public void testGetArea() {  
        int result = rectangle.getArea(12, 2);  
        assertEquals(24, result);  
    }  
}  

测试套件代码:

@RunWith(Suite.class)  
@Suite.SuiteClasses({ CalculateTest.class, CarTest.class, RectangleTest.class })  
public class AllTests {
}  

一个完整的demo

环境配置
环境配置:Linux主机+JDK 1.8+Junit 4.12。

首先确保自己在linux主机装好了java环境,配置好环境变量。

然后下载两个jar包:

junit 4.12 :https://github.com/junit-team/junit4/releases/tag/r4.12

hamcrest-core-1.3.jar : http://central.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar

让后把这两个包放到jdk安装的lib目录下,本机的JDK安装目录如下:

/home/soft/jdk1.8.0_111/lib# ls  
amd64           hamcrest-core-1.3.jar  jexec           packager.jar  
ant-javafx.jar  ir.idl                 junit-4.12.jar  sa-jdi.jar  
ct.sym          javafx-mx.jar          missioncontrol  tools.jar  
dt.jar          jconsole.jar           orb.idl    

然后修改本机环境变量,

vim ~/.bashrc 

修改成如下:

export JAVA_HOME=/home/soft/jdk1.8.0_111  
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/junit-4.12.jar:$JAVA_HOME/lib/hamcrest-core-1.3.jar:$CLASSPATH  
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin    

这里着重看下CLASSPATH,JAVA_HOME和PATH如果设置过,就不用修改了。

然后source ~/.bashrc 让环境变量生效。

新建两个java文件:Calculate.java和CalculateTest.java。


//Calculate.java
package com.trustie.junitest;
public class Calculate {
    public int sum(int var1, int var2) {  
        System.out.println("相加的值是: " + var1 + " + " + var2);  
        return var1 + var2;  
    }  
    public static void main(String[] args) {  
        System.out.println("hh");    
    }
}  
//CalculateTest.java
package com.trustie.test;  
import org.junit.Test;  
import static org.junit.Assert.assertEquals;  
import org.junit.Test;  
import com.trustie.junitest.Calculate;
public class CalculateTest {
    Calculate calculation = new Calculate();  
    int sum = calculation.sum(2, 5);  
    int testSum = 7;
    @Test  
    public void testSum() {  
        System.out.println("@Test sum(): " + sum + " = " + testSum);  
        assertEquals(sum, testSum);  
    }
}  

然后编译执行:

javac -d . Calculate.java  
javac -d . CalculateTest.java  
java org.junit.runner.JUnitCore com.trustie.test.CalculateTest  

就可以看到如下打印:

JUnit version 4.12
相加的值是: 2 + 5
.@Test sum(): 7 = 7
Time: 0.003
OK (1 test)
至此,Junit环境配置成功,可以在本机命令行下运行Junit测试。

其实在命令行中运行JUnit测试,使用了org.junit.runner.JUnitCore类。 这个类提供了runClasses()方法,它允许运行一个或多个测试类。runClasses()方法返回类型是org.junit.runner.Result对象类型。 这个对象可以被用来收集关于测试信息。此外,如果有一个失败的测试,可以用org.junit.runner.notification.Failure对象保存失败测试的描述。

代码示例
之前各个部分中的TestRunner.java我们现在揭开谜底吧:

//TestRunner.java
import org.junit.runner.JUnitCore;  
import org.junit.runner.Result;  
import org.junit.runner.notification.Failure;
public class TestRunner {  
   public static void main(String[] args) {  
      Result result = JUnitCore.runClasses(Test.class);  
      for (Failure failure : result.getFailures()) {  
         System.out.println(failure.toString());  
      }  
      System.out.println(result.wasSuccessful());  
   }  
}

如果你的测试类Test.java中所有测试都通过,以上代码会打印true。

其他

以下哪些维护技术不改变软件系统的功能。

代码重构
设计重构
再工程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

irrationality

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值