您的位置:首页 > 其它

JUnit单元测试快速入门

2017-06-13 11:05 344 查看
目录

单元测试的几个相关概念

工具准备

构建Maven项目

创建JUnit Test Case

JUnit4注解、断言等基础知识

JUnit Test Case运行

JUnit Test Suite运行

测试报告-单元测试覆盖率、通过率

单元测试的几个相关概念

白盒测试 —把测试对象看作一个打开的盒子,程序内部的逻辑结构和其他信息对测试人员是公开的。

回归测试 —软件或环境的修复或更正后的“再测试”,自动测试工具对这类测试尤其有用。

单元测试 —是最小粒度的测试,是针对一个独立的工作单元进行正确性验证的测试。有时也被称为程序员测试,以同QA测试、客户测试相区分。

JUnit  —是一个开放源代码是java测试框架,用于编写和运行可重复的测试。它是用于单元测试框架体系xUnit的一个实例(用于java语言)。主要用于白盒测试、回归测试。

Maven —内置软件仓库,帮助构建打包管理项目。

工具准备

Java JDK:略

Maven:

Maven下载:http://maven.apache.org/download.html

解压到目录,如:C:\Dev\apache-maven-3.5.0

设置环境变量:

    M2_HOME:C:\Dev\apache-maven-3.5.0

    path: %M2_HOME%\bin

创建本地仓库地址:

    mkdir .m2 -->cd .m2-->mkdir repository ----依赖包会拉到此目录

复制settings.xml到.m2

修改settings.xml

    <localRepository>F:\.m2\repository</localRepository> 

    <mirrors>--添加maven阿里云中央仓库:

     <mirror>      

    <id>alimaven</id>      

    <name>aliyun maven</name>      

    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>      

    <mirrorOf>central</mirrorOf> 

    </mirror>

       

Eclipse:

配置maven环境:

    eclipse-->window -->preferences -->Maven

    Installations:



    User Settings:



构建maven项目

导入本地已存在项目,或从svn检出,或新建。过程略。

被测程序:Calculator类

package com.lyndachen.junit.demo;

public class Calculator {

private static int result;

public void add(int n) {

result += n;

}

public void substract(int n) {

result -= 1;

}

public void multiply(int n) {

// result =result * n;

}

public void divide(int n) {

result = result / n;

}

public void square(int n) {

result = n * n;

}

public void squareRoot(int n) {

for (;;);

}

public void clear() {

result = 0;

}

public int getResult() {

return result;

}

}

生成JUnit测试框架

右击类名,点击新建,或者新建里的others,选择JUnit
test case:



选择测试类路径,确认测试类名字,勾选需要的方法,要测试的类:



选择要被测试的方法:


生成测试类CalculatorTest,里面包含一些空的测试用例:



补充测试用例:

package com.lyndachen.junit.demo;

import static org.junit.Assert.*;

import org.junit.After;

import org.junit.AfterClass;

import org.junit.Before;

import org.junit.BeforeClass;

import org.junit.Ignore;

import org.junit.Test;

public class CalculatorTest {

private static Calculator calculator = new Calculator();

@Before

public void setUp() throws Exception {

calculator.clear();

}

@Test

public void testAddWith2and3() {

calculator.add(2);

calculator.add(3);

assertEquals(5, calculator.getResult());

}

@Test

public void testAddWith1AndIntegerMax() {

calculator.add(1);

calculator.add(Integer.MAX_VALUE);

assertEquals(Integer.MIN_VALUE, calculator.getResult());

}

@Test

public void testAddWith1to100() {

for (int i = 0; i <= 100; i++) {

calculator.add(i);

}

assertEquals(5050, calculator.getResult());

}

@Test

public void testSubstract() {

calculator.add(-2);

calculator.substract(0);

assertEquals(-2, calculator.getResult());

}

@Test

public void testSubstractWith0andIntegerMax() {

calculator.substract(Integer.MAX_VALUE);

assertEquals(Integer.MIN_VALUE + 1, calculator.getResult());

}

@Ignore

public void testMultiply() {

calculator.add(2);

calculator.multiply(2);

assertEquals(4, calculator.getResult());

}

@Test

public void testDivide() {

calculator.add(2);

calculator.divide(2);

assertEquals(1, calculator.getResult());

}

@Test

public void testDivideWith3and2() {

calculator.add(3);

calculator.divide(2);

assertEquals(1, calculator.getResult());

}

@Test

public void testDivideWith2and3() {

calculator.add(2);

calculator.divide(3);

assertEquals(0, calculator.getResult());

}

@Test(expected = ArithmeticException.class)

public void testDivideWith2And0() {

calculator.add(2);

calculator.divide(0);

}

}

JUnit测试类和方法的声明

测试类的声明

•测试类是一个独立的类,没有任何父类。测试类的名字也可以任意命名,没有任何局限性。但是建议都用类名+Test来命名。

测试方法的声明

•在测试类中,并不是每一个方法都是用于测试的,你必须使用“标注”也叫注解来明确表明哪些是测试方法。

  @Before、 @Test、@Ignore

•使用@Test注解,以表明这是一个测试方法•方法名字可以随便取,没有任何限制,但是规范写法是test+方法名,方法名第一个字母大写•方法的返回值必须是void•方法不能有任何参数•如果违反这些规定,运行时会抛出一个异常

JUnit4注解解释
  @Before: 每一个测试方法之前运行

  @After : 每一个测试方法之后运行

  @BeforeClass: 所有测试开始之前运行

  @AfterClass: 所有测试结束之后运行

  @Test : 测试方法,测试程序会运行的方法,可以跟参数代表不同的测试

  @Test(expected=*.class):异常测试,expected属性的值是一个异常的类型

  @Test(timeout=xxx):超时测试,如果测试方法在制定的时间之内没有运行完,则测试也失败。

  @Ignore:被忽略的测试方法。当测试的方法还没有实现,或者测试的方法已经过时,或者在某种条件下才能测试该方法(比如需要一个数据库联接,而在本地测试的时候,数据库并没有连接),那么使用该标签来标示这个方法。同时,你可以为该标签传递一个String的参数,来表明为什么会忽略这个测试方法。比如:@lgnore(“该方法还没有实现”),在执行的时候,仅会报告该方法没有实现,而不会运行测试方法。

JUnit断言方法示例:



测试代码详解

importstatic org.junit.Assert.*;

importorg.junit.After;

importorg.junit.AfterClass;

importorg.junit.Before;

importorg.junit.BeforeClass;

importorg.junit.Ignore;

importorg.junit.Test;

•import static org.junit.Assert.*;我们在测试的时候使用的一系列assertEquals等方法就来自这个包。

•org.junit.Ater(After、BeforeClass、AfterClass;、Ignore、Test)表示Junit框架中的相关包,我们用到的注解就需要这些包的支持。

•可以写成一行import
org.junit.*;将所以可能需要的包都引入了。

privatestatic Calculator calculator =new Calculator();

•你要测试哪个类,那么你首先就要创建一个该类的对象•为了测试Calculator类,我们必须创建一个calculator对象

@Test

publicvoid testAddWith2and3() {

  calculator.add(2);

  calculator.add(3);

  assertEquals(5, calculator.getResult());

}

•我们期待的结果应该是5•assertEquals(5, calculator.getResult());就是来判断期待结果和实际结果是否相等

•第一个参数填写期待结果,第二个参数填写实际结果

•JUnit会自动进行测试并把测试结果反馈给用例

@BeforeClass

publicstatic void setUpBeforeClass()throws Exception {}

@AfterClass

publicstatic void tearDownAfterClass()throws Exception {}

@Before

publicvoid setUp()throws Exception {

calculator.clear();}

@After

publicvoid tearDown()throws Exception {}

•@Before、@After 是每个方法测试时候必然被调用的代码。保证每一个测试都是独立的,相互之间没有任何耦合度。这里不需要@Test标注,因为这不是一个test

•只在测试用例初始化时执行@BeforeClass方法,当所有测试执行完毕之后,执行@AfterClass进行收尾工作。用于测试读取文件等耗时的方法。该方法必须是public和static的。

•注意@BeforeClass和@AfterClass只会执行一次

•@Before、@After是每个测试用例执行的时候都会执行

•测试开始->setUpBeforeClass -> setUp->testXXX-> tearDown -> setUp ->testXXX -> tearDown-> …… -> tearDownAfterClass -> 测试结束

JUnit测试脚本运行

在CalculatorTest类上点右键,选择Run As --> JUnitTest来运行:



运行结果如下,有失败用例时,显示失败详情:



运行结果说明:



绿色√表示测试通过;

蓝色x表示测试运行失败Failure,指的是预期结果与实际运行单元的结果不同;

红色x表示测试抛出异常导致的失败Error,指的是您程式没有考虑到的情况,在断言之前程式就因为某种错误引发例外而终止;

JUnit Test Suite

可以创建JunitTest Cuite,同时运行多个测试case:

测试类右键-->new-->other:



搜索JunitTest Suite,下一步,选择测试类:





与JunitTest Case一样,AllTest类上点右键,选择Run As -->JUnit Test运行:



测试集

import org.junit.runner.RunWith;

import org.junit.runners.Suite;

import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)

@SuiteClasses({ CalculatorTest.class, CalculatorTest2.class })

public class AllTests {

}

步骤:

    1.用@RunWith标注传递 一个参数Suite.class

    2.用@SuiteClasses表明这个类是一个打包测试类

    3.把需要打包的类作为参数传递给该标注

测试报告

Maven插件cobertura-maven-plugin提供单元测试整体覆盖率以及分支覆盖率的工具,给编写单元测试的开发者提供一个参考,看其中是否存在有重要代码遗漏的情况。

首先在pom.xml中做如下配置:

<reporting>

 <plugins>

 <plugin>

     <groupId>org.codehaus.mojo</groupId>

     <artifactId>cobertura-maven-plugin</artifactId>

   </plugin>

 </plugins>

</reporting>

然后在项目目录下运行mvncobertura:cobertura,即可生成target目录下生成site\cobertura目录,里面存放了所有的单元测试报告,组织形式如javadoc.其中index.html对所有包的覆盖率做了统计。



点击任意包名,再点击类名,可以看到类中每一行代码是否被覆盖:



如上图所示,左端行号上为绿色的表示应该被覆盖到的代码行,右边无颜色的为已覆盖的代码,红色的为未覆盖的代码。

在项目下运行命令mvnsurefire-report:report,会在target/site下面生成html的报告surefire-report.html





THANK YOU!

个人微信公众号:hi_chen00 (软件测试札记)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: