您的位置:首页 > 其它

《Junit in Action》学习笔记

2009-07-10 15:45 381 查看
本文内容简介:
1.Junit概述
2.Junit相关知识点 和 test suite & testcase使用
3.项目开发流程 & 软件测试类型(Not Finish)
4.白盒测试覆盖(Not Finish)
5.TDD及敏捷开发模型(Not Finish)

正文

1.Junit概述:

①Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。
②Junit测试是自动化测试的一种方式,它使得bug容易被控制。
③Junit本质上是一套框架,即开发者制定了一套条条框框,遵循这此条条框框要求编写测试代码,如继承某个类,实现某个接口,就可以用Junit进行自动测试了。
④由于Junit相对独立于所编写的代码,可以测试代码的编写可以先于实现代码的编写,XP 中推崇的 test first design的实现有了现成的手段:用Junit写测试代码,写实现代码,运行测试,测试失败(状态条为:红色),修改实现代码,再运行测试,直到测试成功(状态条为:绿色)。以后对代码的修改和优化,运行测试成功,则修改成功。

2.Junit 相关使用

①概念:
|- TestCase(测试用例)--扩展Junit的TestCase类的类。它以testXXX方法的形式包含一个或多个测试。一个testcase把具有公共行为的测试归入一组。

|- TestSuite(测试集合)--组测试。一个test suite是吧多个相关测试归入一组的快捷方式。例如,如果没有为TestCase 定义一个test suite,那么Junit会自动提供一个test suite。包含TestCase中所有测试。

|- TestRunner(测试运行器)--执行test suite的程序。Junit提供了几个test runner,可以用来执行你的测试。 没有TestRunner解开,只有一个所偶test runner都继承的BaseTestRunner. 因此,当我们编写TestRunner的时候,实际上指的是任何继承BaseTestRunner的test runner类。

②Junit成员共同产生测试结果:
TestCase + TestSuite + BaseTestRunner = TestResult

③JUnit基本框架的结构
|- import声明引入必须的JUnit类
|- 定义一个测试类从TestCase继承
|- 必需一个调用super(String)的构造函数
|- 测试类包含一些以test..开头的测试方法
|- 每个方法包含一个或者多个断言语句
当然还有一些其他的内容,但满足以上几条的就已经是一个JUnit测试了

④JUnit的命名规则和习惯
|- 如果有一个名为ClassA的被测试函数,那么测试类的名称就是TestClassA
|- 如果有一个名为methodA的被测试函数,那么测试函数的名称就是testMethodA

⑤介绍Test Case、test suite、Test Runner常规使用: (使用的Eclipse自带的Junit)。
|-Test Case

Java代码



import junit.framework.*; //导入junit.jar包

/*TestXxx继承自TestCase(命名规范:一般在类名前加Test)*/

public class TestXxx extends TestCase{

/*测试方法的具体实现(命名规范:以小写的testXxx形式。否则Junt不会自动识别该方法为测试方法)*/

public void testXxx(){};

}

import junit.framework.*;  //导入junit.jar包
/*TestXxx继承自TestCase(命名规范:一般在类名前加Test)*/
public class TestXxx extends TestCase{
/*测试方法的具体实现(命名规范:以小写的testXxx形式。否则Junt不会自动识别该方法为测试方法)*/
public void testXxx(){};
}


|-test suite

Java代码



import junit.framework.Test;

public static Test suite(){

TestSuite suite = new TestSuite(); //实例化

suite.addTest(new MoneyTest("testXxx")); //添加测试方法

suite.addTestSuite(TestMoney.class); //添加整个测试到集合中

}

import junit.framework.Test;
public static Test suite(){
TestSuite suite = new TestSuite();   //实例化
suite.addTest(new MoneyTest("testXxx"));  //添加测试方法
suite.addTestSuite(TestMoney.class);  //添加整个测试到集合中
}


|- Test Runner (junit.textui.TestRunner)

Java代码



public static void main(String args[]){

junit.textui.TestRunner.run(suite()); //将testsuite 执行。

}

public static void main(String args[]){
junit.textui.TestRunner.run(suite()); //将testsuite 执行。
}


⑥Junit断言简介:(都继承自Assert超类)
|- assertEquals(a, b)
Asserts that two primitive values are equal.
测试a是否等于b(a和b是原始类型数值(primitive value)或者必须为实现比较而具有equal方法)

|- assertFalse(a)
Asserts that a condition (a) is false.
测试a是否为false(假),a是一个Boolean数值。

|- assertTrue(a)
Asserts that a condition is true.
测试a是否为true(真),a是一个Boolean数值

|- assertNotNull(a)
Asserts that an object isn't null.
测试a是否非空,a是一个对象或者null。

|- assertNull(a)
Asserts that an object is null.
测试a是否为null,a是一个对象或者null。

|- assertNotSame(a, b)
Asserts that two objects do not refer to the same object.
测试a和b是否没有都引用同一个对象。

|- assertSame(a, b)
Asserts that two objects refer to the same object.
测试a和b是否都引用同一个对象。
|- fail(message)
当程序错误时候,输出错误消息

|-自定义断言
通常而言,JUnit所提供的标准断言对大多数测试已经足够了。然而,在某些环境下,我们可能更需要自定义一些断言来满足我们的需要。
通常的做法是定义一个TestCase的子类,并且使用这个子类来满足所有的测试。新定义的共享的断言或者公共代码放到这个子类中。

⑦ Junit最佳实践:
|- 一次只有一个测试对象:(当无法预计这些对象发生改变时不会造成相互影响)

|- 选择有一个的测试方法名:testXxx命名模式(Xxx为待测方法)。若在同一个方法增添其他测试testXxxYyy的命名模式

|- Assert调用总解释失败原因。第一个参数务必为描述文本

|- setUp方法用来实例化DefaultController. Junit会在调用其他之前调用

|- 一个单元测试等于一个测试方法(简介、专注)

|- 测试任何可能失败的事务

|- 让测试改善代码
编写单元测试常常有助有你写出更好的代码。理由很简单:test case是你代码的用户只有在使用代码时才能发现代码的缺点。所以,不要犹豫,应当根据测试时发现的不使之处重构代码,使其易于使用。测试驱动开发(TDD)的实践就依赖于这条原则。通过先编写测试,你就可以从黛米用户的角度来开发你的类。

|- 让异常测试易懂。把case块中异常变量命名为expected
|- 同一个包,分离目录

3.软件测试类型分为四类:(集成测试、功能测试、压力/负荷测试、验收测试)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: