传统测试的问题:
1.测试滞后。传统的软件开发流程,大多采用瀑布流程。它将软件开发分为需求,分析设计与编著码,整合,测试等阶段,这样折流程很直观,介会导致测试滞后。
2。时间仓促:时间仓促是软件项目最常见的一个问题材和风险,也是测试不能有效完成的原因之一。由于前戎投入过多精力在程式序设计与编码,最后只留下少量时间进行测试。
3。高风险。
在Java中,习惯的测试方法是"testing main",就是第个class都应该有一个用于测试的main函数。这是一个合理的习惯,介这种作法很难运行多个测试或者说同时运行多个测试案例。面JUnit框架恰恰做到了这点,它具备运行自动测试套件的能力。首先来看顾一下JUnit框架的3个核心概念
.TestCase(测试案例):扩展了JUnit的TestCase类。它以testXXX的形式包含一个或多个测试方法。一个test case把具有公共行为的测试归入一组。
.TestSuite(测试套件):一组测试。一个test suit是把多个相关测试归入一组的便捷方式。
.TestRunner(测试运行器):执行test suite的程序。JUnit提供了几个test runner,可以用它们来执行测试。
测试案例:
我们先写一个student类
- public class Student {
- private String _number;
- private String _name;
- private int _score;
- public Student() {
- _number = null;
- _name = null;
- _score = 0;
- }
- public Student(String num, String name, int score) {
- _number = num;
- _name = name;
- _score = score;
- }
- public String getNumber() {
- return _number;
- }
- public String getName() {
- return _name;
- }
- public int getScore() {
- return _score;
- }
- public void setNumber(String num) {
- _number = num;
- }
- public void setName(String name) {
- _name = name;
- }
- public void setScore(int score) {
- _score = score;
- }
- }
接下来我们写一个测试方法类
- import junit.framework.*;
- public class TestIt extends TestCase {
- public TestIt(String name) {
- super(name);
- }
- public void testGetMethod() {
- Student student = new Student("B83503124", "Justin", 100);
- assertEquals("B83503124", student.getNumber());
- assertEquals("Justin", student.getName());
- assertEquals(100, student.getScore());
- }
- public void testSetMethod() {
- Student student = new Student();
- student.setNumber("B83503124");
- student.setName("Justin");
- student.setScore(100);
- assertEquals("B83503124", student.getNumber());
- assertEquals("Justin", student.getName());
- assertEquals(10, student.getScore());
- }
- }
接下来就是运行测试。运行测试方法有很多种。
一。直接在eclipse中运行JunitTest TestIt类。
二。写一个简单的test main
- import junit.framework.*;
- public class Main {
- public static void main(String[] args) {
- junit.textui.TestRunner.run(TestIt.class);
- }
- }
java 代码输出结果是:
- ..FT
- ime: 0.027
- There was 1 failure:
- 1) testSetMethod(TestIt)junit.framework.AssertionFailedError: expected:<10> but
- was:<100>
- at TestIt.testSetMethod(TestIt.java:22)
- at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
- at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
- at Main.main(Main.java:5)
- FAILURES!!!
- Tests run: 2, Failures: 1, Errors: 0
三。可以在TestIt中重构suite()方法在JUnit 2.0之后,提供一个简单的动态方法构建TestSuit套件,您只要將TestCase的Class对像传給它作为參數就可以了
- public static Test suite() {
- return new TestSuite(TestIt.class);
- }
四。可以使用静态的方法来构建TestSuite套件
- public static Test suite() {
- TestSuite suite= new TestSuite();
- suite.addTest(
- new TestIt("TestGet") {
- protected void runTest() { testGetMethod(); }
- }
- );
- suite.addTest(
- new TestIt("TestSet") {
- protected void runTest() { testSetMethod(); }
- }
- );
- return suite;
- }
最后总结下单元测试技巧:
1.选择容易出错的地方。
2.录找临界条件
3.检查异常 是否如期出现