用例设计很麻烦,每个都要考虑
第一个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。
其他
以下哪些维护技术不改变软件系统的功能。
代码重构
设计重构
再工程