目录
单元测试的几个相关概念
工具准备
构建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
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中做如下配置:
然后在项目目录下运行mvncobertura:cobertura,即可生成target目录下生成site\cobertura目录,里面存放了所有的单元测试报告,组织形式如javadoc.其中index.html对所有包的覆盖率做了统计。
点击任意包名,再点击类名,可以看到类中每一行代码是否被覆盖:
如上图所示,左端行号上为绿色的表示应该被覆盖到的代码行,右边无颜色的为已覆盖的代码,红色的为未覆盖的代码。
在项目下运行命令mvnsurefire-report:report,会在target/site下面生成html的报告surefire-report.html
THANK YOU!