实验五 Junit单元测试1
1.实验目的
- 学习使用 JUnit4.X 进行单元测试;
- 应用 JUnit4.X 进行单元测试,为工程项目中的类,设计测试类,并且运用白盒测试和黑盒测试方法为类中的方法设计足够充分的测试用例集,从而保证 每一个类代码的正确性和健壮性。
2.实验内容
题目1: 建一个测试除法类(TestDivide),并编写相应的测试用例 Junit test case;
步骤一:创建新工程JunitTest,项目结构如图所示
步骤二:创建测试类并测试,发现报错:
步骤三:修改测试类并进行测试,测试成功:
题目2:栈(MyStack)具有 4 个方法,构建测试类 TestMyStack,对这个 4 个方法设计测试用例进行单元测试;
由题目可知MyStack类包含4个方法:push()、pop()、top()和delete()。可以编写以下测试对这4个方法进行单元测试:
public class MyStackTest extends TestCase {
private MyStack myStack;
public void setUp() {
myStack = new MyStack();}
public void testPush() {
try {
myStack.push("hello world");
} catch (Exception e) {
e.printStackTrace();}
String result = null;
try {
result = myStack.pop();
} catch (Exception e) {
e.printStackTrace();
}
//向堆栈中压入一个元素然后再弹出一个元素,以确定元素是否压入成功
Assert.assertEquals("hello world", result);}
public void testPush22() {
for (int i = 0; i < 100; ++i) {
try {
myStack.push(i + ""); //把整数转化为字符串
} catch (Exception e) {
e.printStackTrace();
}}
for (int i = 0; i < 100; ++i) {
String result = null;
try {
result = myStack.pop();
} catch (Exception e) {
e.printStackTrace();}
//向堆栈中压入100个元素,然后再弹出100个元素,以确定元素是否压入成功
//压入时第一个元素被压入到栈底。所以弹出来的元素与压入元素的顺序相反的
Assert.assertEquals((99 - i)+"", result);
}}
public void testPush33() {
Throwable tx = null;
try {
for (int i = 0; i <= 100; ++i) {
myStack.push(i + ""); }
Assert.fail(); //该行代码不可以写在for循环里面
} catch (Exception e) {
e.printStackTrace();
tx = e;
}
Assert.assertNotNull(tx);
Assert.assertEquals(Exception.class, tx.getClass());
Assert.assertEquals("数组越界异常!", tx.getMessage());}
public void testPop() {
Throwable tx = null;
try {
myStack.pop();
Assert.fail();
} catch (Exception e) {
e.printStackTrace();
tx = e;}
Assert.assertNotNull(tx);
Assert.assertEquals(Exception.class, tx.getClass());
Assert.assertEquals("数组越界异常!", tx.getMessage());}
public void testTop() {
try {
myStack.push("hello world");
String result = myStack.top();
Assert.assertEquals("hello world", result);
} catch (Exception ex) {
ex.printStackTrace();
}}
public void testTop22() {
Throwable tx = null;
try {
myStack.top();
Assert.fail();
} catch (Exception e) {
e.printStackTrace();
tx = e;}
Assert.assertNotNull(tx);
Assert.assertEquals(Exception.class, tx.getClass());
Assert.assertEquals("数组越界异常!", tx.getMessage());}
public void testDelete() {
try {
for (int i = 0; i < 10; ++i) {
myStack.push(i + "");}
myStack.delete(10);
} catch (Exception ex) {
ex.printStackTrace();
Assert.fail();
}}
public void testDelete22() {
Throwable tx = null;
try {
for (int i = 0; i < 10; ++i) {
myStack.push(i + "");}
myStack.delete(11);
} catch (Exception ex) {
ex.printStackTrace();
tx = ex;}
Assert.assertNotNull(tx);
Assert.assertEquals(Exception.class, tx.getClass());
Assert.assertEquals("数组越界异常!", tx.getMessage());
}}
题目3:使用套件运行器(Suite.class),建立测试类 TestAll,对已经建立的测试类进行套件化的测试。
可创建如下测试类:
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@SuiteClasses({DivideTest.class,MyStackTest.class })
public class TestAll {
}
3.实验分析
题目一按照实验指导书操作即可完成,较为简单,实现后初步了解了如何使用Eclipse来进行单元测试。题目二是对MyStack类进行测试,需要测试四个方法,我做的测试较为简单。题目三只需要编写一个简单的TestAll测试类即可。
实验思考题:
(1)在单元测试中,如何应用JUnit动手写一个类的单元测试方法,并让其成功运行?
答:导入Junit包,建立该类后使用创建Junit测试类的方法写单元测试方法,根据测试目的修改测试类后可成功运行。
(2)JUnit 4 有何特点?
答:JUnit 4是一种与其之前的版本完全不同的API,它根据Java 5.0中的新特征(注解,静态导入等)构建而成。JUnit 4更简单、更丰富和更易于使用,而且它引入了更为灵活的初始化和清理工作,还有限时的和参数化测试用例。
4.实验总结
通过这次实验,对使用Eclipse进行单元测试有了了解。使用Eclipse进行单元测试,由于Eclipse与Junit集成,所以无需下载。但是因为junit包导入的位置错误,导致单元测试一直不成功,找不到包的位置,后来经过修改终于不再报错。