单元测试工具
1.1 单元测试
单元测试是指测试代码中小的单元的测试。一个单元可以是一个函数、一个类、一个包或者一个子系统。
1.2 测试覆盖
指在测试中,被测试到的代码在程序中所占比例。
1.3 JAVA的单元测试工具
前成熟的单元测试框架包括:JUnit、TestNG、gtest、pytest、unittest
2 JUnit
Junit是一个开源测试框架,用于编写和运行可重复的自动化测试,因此我们可以确保我们的代码按预期工作。JUnit在工业中被广泛使用,可以作为独立Java程序(从命令行)使用,也可以在Eclipse等IDE中使用。数 Java 的开发环境都已经集成了 JUnit 作为单元测试的工具。
- JUnit 使用断言进行测试,其中的断言机制将预期结果和程序运行结果相对比,保证结果预期可知性。
- 用JUnit 进行测试要建立一个完全的测试对象
- 必须使用@Test的注解
2.1 JUnit使用的简单例子
被测试的程序代码如下:
package com.javacodegeeks.junit;
public class Calculate {
public int sum(int var1, int var2) {
System.out.println("Adding values: " + var1 + " + " + var2);
return var1 + var2;
}
}
建立单独的测试类;
package com.javacodegeeks.junit;
import static org.junit.Assert.*;
import org.junit.Test;
public class CalculateTest {
Calculate calculation = new Calculate();
int sum = calculation.sum(2, 5);
int testSum = 7;
@Test
public void testSum() {
System.out.println("@Test sum(): " + sum + " = " + testSum);
assertEquals(sum, testSum);
}
}
运行程序的结果输出
Adding values: 2 + 5
@Test sum(): 7 = 7
2.2 JUnit 注解
注解 | 描述 |
---|---|
@Test | 所注解方法的代码为测试用例,包含对源程序的测试代码 |
@BeforeClass | 所注解的方法是JUnit测试时首先被运行的方法且只能运行一次,通常用来进行预处理等操作 |
@Before | 所注解的方法在每个Test测试用例运行前运行,常用来进行初始化测试用例所需的资源 |
@After | 所注解的方法在每个Test测试用例运行后运行,常用于释放@Before注解方法打开的资源。(当@Before或@Test注解的方法发生异常时,@After所注解的方法仍会被运行) |
@AfterClass | 所注解的方法是JUnit测试时最后一个被运行的方法且只能运行一次,通常用来释放相关使用资源 |
@Ignore | 所注解的方法在测试过程中不会运行。 |
2.3 JUnit断言 assertions
断言 | 功能 |
---|---|
assertEquals([String message], expected value, actual value) | 检查int, short, long, byte, char或Object等类型的值是否相等,第一个参数是一个可选的字符串消息。 |
assertEquals(double expected value, double actual value, double delta) | 检查指定误差范围内的double类型值是否相等,需要第三个参数delta表示可接受的误差范围。 |
assertNotEquals([String message], expected value, actual value) | 检查值是否不相等,第一个参数是一个可选的字符串消息。 |
assertArrayEquals([String message], expectedArray, resultArray) | 检查两数组内容是否相同 |
assertTrue(boolean condition) | 检查条件是否为真 |
assertFalse(boolean condition) | 检查条件是否为假 |
assertNull(Object object) | 检查对象是否为空 |
assertNotNull(Object object) | 检查对象是否不空 |
assertSame(Object expected, Object actual) | 检查两个变量是否引用同一 |
assertNotSame(Object expected, Object actual) | 检查两个变量是否不引用同一对象 |
简单实例:
package com.junit.main;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
class MyTest {
String t1="hello";
String t2="world";
int num1=1;
int num2=2;
int[] arr1=new int[] {1,2,3};
int[] arr2=new int[] {1,2,3};
double dnum1=1.0;
double dnum2=1.9;
Object ob1=null;
Object ob2="hahaha";
@BeforeEach
void setUp() throws Exception {
}
@AfterEach
void tearDown() throws Exception {
}
@Test
void testAssertEquals() {
//fail("Not yet implemented");
assertEquals(num1, num1); //num1和num1相等
assertNotEquals(num1, num2); //num1和num2不相等
assertEquals(dnum1, dnum2, 1.0); //dnum1和dnum2的误差为0.9在范围在1.0之内
}
@Test
void testAssertTrue() {
assertTrue(num1!=num2);//num1!=num2为true
assertFalse(num1==num2);//num1==num2为false
}
@Test
void testAssertSame() {
assertSame(t1, t1); //t1和t1引用同一对象
assertNotSame(t1, t2); //t1和t2引用不同对象
}
@Test
void testAssertArrayEquals() {
assertArrayEquals(arr1, arr2); //arr1和arr2的数组内容相同
}
@Test
void testAssertNull() {
assertNull(ob1); //ob1为null
assertNotNull(ob2); //ob2不空
}
}
3 其他测试工具
3.1 TestNG
TestNG 是另一个为Java编程语言设计的开源单元测试框架,是一个受JUnit和NUnit启发而来的测试框架,但它引入了一些新功能,使其更强大、更容易使用,例如:
- 核心特性是多线程测试执行,测试代码是否是多线程安全的;
- 提供注释支持;
- 支持数据驱动测试(使用@DataProvider);
- 支持参数化测试;
- 强大的执行模型(不再有TestSuite);
- 支持各种工具和插件(Eclipse, IDEA, Maven等…);
- 嵌入BeanShell以获得更多的灵活性;
- 用于运行时和日志记录的默认JDK函数(没有依赖关系)。
3.2 GoogleTest
GoogleTest是一个跨平台的(Liunx、Mac OS X、Windows 、Cygwin 、Windows CE and Symbian ) C++单元测试框架,由google公司发布,为在不同平台上为编写C++测试而开发的。它提供了丰富的断言、致命和非致命判断、参数化、”死亡测试”等等。
3.3 pytest
pytest是一个非常成熟的全功能的支持Python语言的单元自动化测试框架。简单灵活,容易上手,支持参数化;能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试,以及接口自动化测试(pytest集成requests)