一、安装JUnit.jar
https://github.com/junit-team/junit4/wiki/Download-and-Install
二、JUnit的介绍 (一)
①、继承于TestCase类的表示一个单元测试类。
②、添加的测试方法必须以test开头,并且必须是public修饰符。(该测试函数不需要人为调用)
③、JUnit的生命周期
setUp(): 初始化被测试的对象
↓
各种测试方法 进行测试
↓
tearDown() 进行扫尾工作
④、JUnit的测试函数
assertEquals():判断两个值或者对象是否相同。第一个参数表示期望值,第二个参数表示测试生成的实际值
assertTrue() or assertFalse() :判断某个值是否为true或者false
assertNull() or assertNotNull():判断某个值是否为null
assertSame() or assertNotSame():判断两个对象是否为同一个对象
fail方法:(与assert不同之处在于,错误时候的异常是自定义的)
failNotEquals:有三个参数,第一个参数表示当错误时候的自定义的参数信息。第二个参数表示期望值。第三个参数表示测试生成的值。如果not equals 则抛异常。
failSame or failNotSame:同理。
failNull or failNotNull:同理
测试举例:
被测试类Adder:用来将两个整数相加
public class Adder{
public int add(int a,int b){
return a + b;
}
}
测试类AdderTest
1、继承TestCase,然后重写setUp()和tearDown();
2、在setUp()创建测试类,创建测试方法testAdd()
public class AdderTest extends TestCase {
Adder mAdder;
@Override
protected void setUp() throws Exception {
// TODO Auto-generated method stub
super.setUp();
mAdder = new Adder();
}
public void testAdd(){
assertEquals(7, mAdder.add(3, 4));
assertEquals(10, mAdder.add(5, 5));
assertEquals(-1, mAdder.add(5, 6));//该行错误,报错
}
@Override
protected void tearDown() throws Exception {
// TODO Auto-generated method stub
super.tearDown();
mAdder = null;
}
}
然后发现测试方法的第三行出现了错误,错误的log
junit.framework.AssertionFailedError: expected:<-1> but was:<11>
<-1>表示期望值。
<11>表示测试的实际值。
两个值不一致,导致错误。并且log页显示红色,如果成功显示绿色。
三、JUnit介绍(二)
需求:有时候我们需要测试多个类,有没有什么方法能够将多个测试类同时运行呢?
TestSuite:表示执行多个测试类的集合。
JUnit4TestAdapter:用来包装测试类。然后装入到TestSuit的集合中。
举例:首先我们建立了Adder类(加法)、Diver类(减法)。并分别创建他们的测试类。
public class MathSuite {
//①、创建类,并创建public static Test suit()方法,测试时候会自动调用该方法
public static Test suit(){
//②、创建测试集合类
TestSuite suite = new TestSuite();
//③、将测试类用JUnit4TestAdapter封装并加入TestSuite
suite.addTest(new JUnit4TestAdapter(AdderTest.class));
suite.addTest(new JUnit4TestAdapter(Diver.class));
return suite;
}
}
四、实践
背景:家庭使用电费每月标准
当使用1~10度电则按1元/度收费。
当使用11~25度电按2 元/度收费。
当使用25~40按3 元/度收费
当超过40 按4 元/度收费。
以此建立价格:
public class ElectricCharge {
public int total(int count){
if (count > 1 && count <10){
return 1 * count;
}
else if (count > 10 && count < 25){
return 2 * count;
}
else if (count > 25 && count <40){
return 3 * count;
}
else {
return 4 * count;
}
}
}
然后进行单元测试:
public class ElectricChargeTest extends TestCase{
ElectricCharge mElectricCharge;
@Override
protected void setUp() throws Exception {
// TODO Auto-generated method stub
super.setUp();
mElectricCharge = new ElectricCharge();
}
public void testTotal(){
//该行报错:因为当传入 负数 的时候返回值一律为0
assertEquals(-1,mElectricCharge.total(-1));
assertEquals(3*1, mElectricCharge.total(3));
//该行报错:因为没有对 当 count == 10的时候做判断
assertEquals(10*1, mElectricCharge.total(10));
assertEquals(2*12, mElectricCharge.total(12));
}
@Override
protected void tearDown() throws Exception {
// TODO Auto-generated method stub
super.tearDown();
mElectricCharge = null;
}
}
修改回来:
public int total(int count){
if (count > 1 && count <= 10){
return 1 * count;
}
else if (count > 10 && count <= 25){
return 2 * count;
}
else if (count > 25 && count <= 40){
return 3 * count;
}
else if (count > 40){
return 4 * count;
}
return 0;
}