软件测试实验单元测试工具JUNIT_第1页
软件测试实验单元测试工具JUNIT_第2页
软件测试实验单元测试工具JUNIT_第3页
软件测试实验单元测试工具JUNIT_第4页
软件测试实验单元测试工具JUNIT_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、武 汉 轻 工 大 学软件测试实验报告实验一 单元测试工具JUNIT姓 名: 李娅娅 学 号: 1505110015 班 级: 软工1503 指导老师: 丁月华 1. 实验目的了解自动化测试工具JUnit的架构、功能,学习如何下载、安装JUnit,掌握使用JUnit对Java程序进行单元测试的方法。2. 实验步骤2.1 导入jar包右击项目名,单击Build Path中的Add Libraries.选择User Libariry。新建一个存放Junit的包的库将导入Jar包导入完成。2.2 编写第一个Junit测试类 Calculator类编写被测试类Calculator:(拷贝) priva

2、te static int result; / 静态变量,用于存储运行结果 public void add(int n) result = result + n; public void substract(int n) result = result - 1; /Bug: 正确的应该是 result =result-n public void multiply(int n) / 此方法尚未写好 public void divide(int n) result = result / n; public void square(int n) result = n * n; public void

3、 squareRoot(int n) for (; ;) ; /Bug : 死循环 public void clear() / 将结果清零 result = 0; public int getResult() return result; CalculatorTest类编写CalculatorTest类,用于测试Calculator类:(拷贝)public class CalculatorTest private static Calculator calculator = new Calculator(); Before public void setUp() throws Exceptio

4、n calculator.clear(); Test public void testAdd() calculator.add(2); calculator.add(3); assertEquals(5, calculator.getResult(); Test public void testSubstract() calculator.add(10); calculator.substract(2); assertEquals(8, calculator.getResult(); Ignore("Multiply() Not yet implemented") Test

5、 public void testMultiply() Test public void testDivide() calculator.add(8); calculator.divide(2); assertEquals(4, calculator.getResult(); 运行测试在类名上右击,选择Run As à Junit Test 得到Junit面板,并显示了哪些测试是成功的,哪些是失败的以及哪些是未执行(直接跳过了):2.3 使用JUnit对Money类进行单元测试 Money类(拷贝)public class Money private int fAmount; /货币

6、余额private String fCurrency; /货币类型public Money(int amount, String currency)fAmount=amount;fCurrency=currency;public int amount()return fAmount;public String currency() return fCurrency; public Money add(Money m)/add方法把两个Money对象相加,合成一个Money对象return new Money(amount()+m.amount(),currency();public boole

7、an equals(Object anObject)/equals方法判断两个Money对象是否相等if(anObject instanceof Money)Money aMoney=(Money)anObject;return aMoney.currency().equals(currency()&&amount()=aMoney.amount();return false; 现在要对Money类的add方法进行测试,步骤如下: MoneyTest类(1) 创建对象定义几个Money类的对象Money result;Money m12CHF=new Money(12,&quo

8、t;CHF");Money m14CHF=new Money(14,"CHF");Money expected=new Money(26,"CHF"); /预期的运行结果(2) addTest()在MoneyTest类中编写testAdd方法,对Money类中的add()方法进行测试:Testpublic void testAdd()result=m12CHF.add(m14CHF);assertTrue(expected.equals(result);/判断运行结果是否与预期值相同(3) testEquals()Testpublic void

9、 testEquals() assertTrue(!m12CHF.equals(null); assertTrue(!m12CHF.equals(m14CHF); assertEquals(m12CHF,m12CHF); assertEquals(m12CHF,new Money(12,"CHF"); 2.3.3 运行测试测试通过2.4 Fixture和几个标签Fixture的含义就是“在某些阶段必然被调用的代码”。比如我们上面的测试,由于只声明了一个Calculator对象,他的初始值是0,但是测试完加法操作后,他的值就不是0了;接下来测试减法操作,就必然要考虑上次加法操

10、作的结果。这绝对是一个很糟糕的设计!我们非常希望每一个测试都是独立的,相互之间没有任何耦合度。因此,我们就很有必要在执行每一个测试之前,对Calculator对象进行一个“复原”操作,以消除其他测试造成的影响。因此,“在任何一个测试执行之前必须执行的代码”就是一个Fixture,我们用Before来标注它,如前面例子中的setUp()方法所示:这里不在需要Test标注,因为这不是一个test,而是一个Fixture。同理,如果“在任何测试执行之后需要进行的收尾工作”也是一个Fixture,使用After来标注。2.4.1 代码测试public class TTest BeforeClass p

11、ublic static void beforeClass() System.out.println("beforeClass"); AfterClasspublic static void afterClass() System.out.println("afterClass"); Beforepublic void before() System.out.println("before"); Testpublic void testAdd() int z = new T().add(5, 3); assertThat(z, is(

12、8); assertThat(z, allOf(greaterThan(5), lessThan(10); Test(expected = java.lang.ArithmeticException.class, timeout = 100)public void tDivide() int z = new T().divide(8, 0); Afterpublic void after() System.out.println("after");2.4.2 运行结果在控制台中得到运行结果:在Junit选型卡中得到:(1) 结果分析在Junit选项卡中由于代码找不到T类,而

13、使方法运行错误。在控制台中输出两次before和两次after,是因为在类中test了两个方法,每运行一个方法,before和after下的方法就是默认执行。2.4.3 标签学习(1) Test测试方法(2) Before使用了该元数据的方法在每个测试方法执行之前都要执行一次,一般做初始化方法。 (3) After使用了该元数据的方法在每个测试方法执行之后要执行一次,一般用于释放资源。(4) ignore该元数据标记的测试方法在测试中会被忽略。你可以为该标签传递一个String的参数,来表明为什么会忽略这个测试方法。比如:lgnore(“该方法还没有实现”),在执行的时候,仅会报告该方法没有实

14、现,而不会运行测试方法。 (5) BeforeClass所有测试开始之前运行,一个测试类只能有一个,并且必须声明为public static。该方法在内存中只存在一份实例,比较适合加载配置文件。(6) AfterClass:所有测试结束之后运行 ,一个测试类只能有一个,并且必须声明为public static。 通常用来对资源进行清理,比如关闭数据库的连接。(备注:为什么需要BeforeClass 和 AfterClass ,我们来看看他们是否适合完成如下功能:有一个类是负责对大文件(超过 500 兆)进行读写,他的每一个方法都是对文件进行操作。换句话说,在调用每一个方法之

15、前,我们都要打开一个大文件并读入文件内容,这绝对是一个非常耗费时间的操作。如果我们使用 Before 和 After ,那么每次测试都要读取一次文件,效率及其低下。这里我们所希望的是在所有测试一开始读一次文件,所有测试结束之后释放文件,而不是每次测试都读文件。 JUnit 的作者显然也考虑到了这个问题,它给出了 BeforeClass 和 AfterClass 两个 Fixture 来帮我们实现这个功能。从名字上就可以看出,用这两个 Fixture 标注的函数,只在测试用例初始化时执行 BeforeClass 方法,当所有测试执行完毕之后,执行 AfterClass 进行收尾工作。)JUnit

16、4的单元测试用例执行顺序为: BeforeClass -> Before -> Test -> After -> AfterClass。每一个测试方法的调用顺序为: Before -> Test -> After。可以根据以上给定的标记来构造测试类中的测试方法,一般说来遵守以下约定:类放在test包中类名用XXXTest结尾方法用testMethod命名2.5 限时测试Test(timeout=value) ,例如Test(timeout=1000)2.5.1 被测源代码2.5.2 测试代码 Test(timeout = 1000) public void

17、testSquareRoot() calculator.squareRoot(4); assertEquals(2, calculator.getResult();2.5.3 运行测试在测试代码中Timeout 参数表明了设定的时间,单位为毫秒,因此 1000 就代表 1 秒,测试的方法超过了设定的时间表示失败。2.6 异常测试对除法运算中的“除0异常”进行测试2.7 综合练习2.7.1 测试代码public class CalculatorTest private static Calculator calculator = new Calculator();BeforeClass publ

18、ic static void beforeClass() System.out.println("beforeClass"); AfterClasspublic static void afterClass() System.out.println("afterClass"); Beforepublic void before() System.out.println("before"); Afterpublic void after() System.out.println("after"); Before pu

19、blic void setUp() throws Exception calculator.clear(); Test public void testAdd() calculator.add(2); calculator.add(3); assertEquals(5, calculator.getResult(); Test public void testSubstract() calculator.add(10); calculator.substract(2); assertEquals(8, calculator.getResult(); Ignore("Multiply(

20、) Not yet implemented") Test public void testMultiply() Test public void testDivide() calculator.add(8); calculator.divide(2); assertEquals(4, calculator.getResult(); Test(timeout = 1000) public void testSquareRoot() calculator.squareRoot(4); assertEquals(2, calculator.getResult(); Test(expecte

21、d = ArithmeticException. class ) public void divideByZero() calculator.divide( 0 ); 2.7.2 运行测试(1) 控制台分析:在代码中定义了BeforeClass和AfterClass标签,因此,在输出的首尾有这标签下定义的输出信息。代码中编写了6个测试方法,因此对Before,After标签下的输出信息打印了5遍(其中方法testMultiply使用了Ignore标签)。(2) Junit选项卡测试结果为三个通过,一个忽略,一个失败,一个错误。2.8 运行器RunWith当把测试代码提交给JUnit框架后,框架

22、就会通过Runner来运行代码。在JUnit中有很多个Runner,他们负责调用测试代码,每一个Runner都有各自的特殊功能,你要根据需要选择不同的Runner来运行你的测试代码。JUnit中有一个默认Runner,如果你没有指定,那么系统自动使用默认Runner来运行你的代码。也就是说,下面两段代码含义是完全一样的:public class CalculatorTest. /该方式就是使用了默认的Runner等价于RunWith(JUnit4ClassRunner.class)public class CalculatorTest. /声明了Runner从上述例子可以看出,要想指定一个Ru

23、nner,需要使用RunWith标注,并且把你所指定的Runner作为参数传递给它。另外一个要注意的是,RunWith是用来修饰类的,而不是用来修饰函数的。只要对一个类指定了Runner,那么这个类中的所有函数都被这个Runner来调用。是对其他Runner的学习:2.8.1 参数化测试RunWith(Parameterized. class )把一组组的测试数据集中放在一个集合中,这个集合作为测试类的参数,进行集中测试,避免为每一组测试数据写一个测试方法。你可能遇到过这样的函数,它的参数有许多特殊值,或者说他的参数分为很多个区域。比如,一个对考试分数进行评价的函数,返回值分别为“优秀,良好,

24、一般,及格,不及格”,因此你在编写测试的时候,至少要写 5 个测试,把这 5 中情况都包含了,这确实是一件很麻烦的事情。我们还使用我们先前的例子,测试一下“计算一个数的平方”这个函数,暂且分三类:正数、 0 、负数。(1) 测试代码按照之前的方法,要测试三类就需要编写三个测试方法:public class AdvancedTest private static Calculator calculator = new Calculator(); Before public void clearCalculator() calculator.clear(); Testpublic void squ

25、are1() calculator.square( 2 ); assertEquals( 4 , calculator.getResult(); Testpublic void square2() calculator.square( 0 ); assertEquals( 0 , calculator.getResult(); Testpublic void square3() calculator.square( - 3 );assertEquals( 9 , calculator.getResult(); 运行结果:为了简化类似的测试, JUnit4 提出了“参数化测试”的概念,只写一个测

26、试函数,把这若干种情况作为参数传递进去,一次性的完成测试。代码如下:RunWith(Parameterized. class )/更改默认的测试运行器为Parameterized.classpublic class SquareTest private static Calculator calculator = new Calculator(); private int param;/声明变量存放输入参数(用来计算实际结果) private int result;/声明变量存放预期值 /声明一个返回值为Collection的公共静态方法,并用Parameters修饰Parameterspub

27、lic static Collection data() return Arrays.asList( new Object 2,4 , 0,0 , -3 ,9 ); /为测试类声明一个带有参数的公共构造方法,并为声明变量赋值 public SquareTest( int param, int result) this .param = param; this .result = result; Test public void square() calculator.square(param); assertEquals(result, calculator.getResult(); 分析:首

28、先,要为这种测试专门生成一个新的类,而不能与其他测试共用同一个类,此例中我们定义了一个SquareTest类。然后,你要为这个类指定一个Runner,而不能使用默认的Runner了,因为特殊的功能要用特殊的Runner。RunWith(Parameterized.class)这条语句就是为这个类指定了一个ParameterizedRunner。第二步,定义一个待测试的类,并且定义两个变量,一个用于存放参数,一个用于存放期待的结果。接下来,定义测试数据的集合,也就是上述的data()方法,该方法可以任意命名,但是必须使用Parameters标注进行修饰。之后是构造函数,其功能就是对先前定义的两个参数进行初始化。(2) 测试结果2.8.2 测试套件RunWith(Suite.class)通过前面的案例学习到,在一个项目中,只写一个测

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论