一,junit4测试框架
1,定义
-
junit
是Java编程语言的单元测试框架,用于编写和可重复运行的自动化测试
2,特点
- JUnit是一个开放的资源框架,用于编写和可重复运行的测试
- 提供注解来识别测试方法
- 提供断言来测试预期结果
- JUnit测试允许你编写代码块更快,并能提高质量
- Junit优雅简洁.没那么复杂,花费时间较少
- Junit测试可以自动运行并检查自身结果并提供即时反馈.所以也没有必要人工梳理测试结果的报告
- Junit测试可以被组织为测试套件,包含测试用例,甚至其他的测试套件
- Junit在一个条中显示进度.如果运行良好则是绿色;如果运行失败,则变成红色
3,导入依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
4,常用注解
5,常用注解代码
a,基本注解
package com.ceshi.junit4Demo;
import org.junit.*;
public class Junit4DemoTest {
@BeforeClass
public static void beforClass(){
System.out.println("该用例在所有测试之前执行一次");
}
@AfterClass
public static void afterClass(){
System.out.println("该用例在所有测试之后执行一次");
}
@Before
public void before(){
System.out.println("该用例在每个测试方法之前执行一次");
}
@Test
public void test001(){
System.out.println("这是第一条测试用例");
}
@Test
public void test002(){
System.out.println("这是第二条测试用例");
}
@After
public void after(){
System.out.println("该用例在每个测试方法之后执行一次");
}
@Ignore
public void ignoreTest(){
System.out.println("跳过该测试用例");
}
}
b,@Parameterized参数化注解
package com.ceshi.junit4Demo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.util.Arrays;
import java.util.List;
import static org.junit.Assert.assertEquals;
//这里不能使用默认的Runner了,特殊功能要用特殊Runner
//使用@Parameterized注解需要注意:
// 该方法要有构造函数;
// 有一个public static的方法被@Parameters标注,并且该方法只能返回Iterable类型或数组类型的数据
@RunWith(Parameterized.class)
public class ParameterTest {
private int expect;
private int firstNumber;
private int secondNumber;
//构造方法
public ParameterTest(int expect, int firstNumber, int secondNumber) {
this.expect = expect;
this.firstNumber = firstNumber;
this.secondNumber = secondNumber;
}
//新建一个方法用于传参,方法必须为static方法
@Parameterized.Parameters
public static List<Integer[]> data(){
return Arrays.asList(new Integer[][]{{3, 1, 2}, {5, 3, 2},{6,2,4}});
}
@Test
public void parameterTest(){
String format = "expect=%d firstNumber=%d secondNumber=%d ";
System.out.println(String.format(format,expect,firstNumber,secondNumber));
assertEquals(expect, firstNumber+secondNumber);
}
}
c,测试套件注解 @RunWith和@Suite
package com.ceshi.junit4Demo;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
//@RunWith和@Suite这两个注解是用来运行套件测试
@RunWith(Suite.class)
@Suite.SuiteClasses({ParameterTest.class,Junit4DemoTest.class}) //这里类的配置顺序会影响执行顺序
public class SuiteTest {
}
d,执行顺序注解 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
- @FixMethodOrder(MethodSorters.DEFAULT) //取决于反射方法获得的列表,顺序固定(不保险)
- @FixMethodOrder(MethodSorters.JVM) //顺序可能变化,不固定
- @FixMethodOrder(MethodSorters.NAME_ASCENDING) //按照名字ASCII顺序(稳定常用,建议使用)
package com.ceshi.junit4Demo;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
//@FixMethodOrder 按顺序执行注解
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class MethodOrderTest {
@Test
public void testFirst(){
System.out.println("第1条用例");
}
@Test
public void testSecond(){
System.out.println("第2条用例");
}
@Test
public void testThree(){
System.out.println("第3条用例");
}
}
二,testNg测试框架拓展
1,特点
注解驱动: TestNG 使用注解来标识测试方法、测试类和配置方法,使得测试更具可读性。
并行执行: TestNG 支持多线程并行执行测试,可以加速测试套件的执行。
丰富的配置: 可以通过 XML 配置文件来定义测试套件的执行顺序、依赖关系等。
分组测试: 可以将测试方法分组,实现对特定测试分组的执行。
参数化测试: 可以使用 @Parameters 和@ DataProvider注解实现参数化测试
依赖管理: 可以通过 dependsOnMethods 或 dependsOnGroups 设置测试方法之间的依赖关系。
断言灵活: TestNG 提供了丰富的断言方法,用于验证测试结果。
2,pom依赖导入
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.2</version>
</dependency>
</dependencies>
3,基本注解
更多详细注解可以参考文档:https://blog.51cto.com/u_15181572/6698378
* @Test:用于标识测试方法,执行单元测试。
* @BeforeSuite:在测试套件之前执行。
* @AfterSuite:在测试套件之后执行。
* @BeforeTest:在测试类之前执行。
* @AfterTest:在测试类之后执行。
* @BeforeClass:在测试类中的所有测试方法之前执行。
* @AfterClass:在测试类中的所有测试方法之后执行。
* @BeforeMethod:在每个测试方法之前执行。
* @AfterMethod:在每个测试方法之后执行。
* @DataProvider:用于提供测试数据。
* @Parameters:用于参数化测试。
* @dependsOnMethods:设置测试方法的依赖关系。
3.1 基本注解示例
import org.testng.annotations.*;
public class NGTest {
@BeforeClass
void beforeClass(){ System.out.println("BeforeClass: 在调用当前类的测试方法前执行一次"); }
@AfterClass
void afterClass(){ System.out.println("AfterClass: 在调用当前类的所有测试方法后执行一次"); }
@BeforeMethod
void beforeMethod(){ System.out.println("BeforeMethod: 在调用每个测试方法前执行一次"); }
@AfterMethod
void afterMethod(){ System.out.println("AfterMethod: 在调用每个测试方法后执行一次"); }
@BeforeTest
void beforTest(){ System.out.println("BeforTest: 在所有带有test标签的测试方法调用前执行"); }
@AfterTest
void afterTest(){ System.out.println("AfterTest: 在所有带有test标签的测试方法调用后执行"); }
@Test
void testNG(){ System.out.println("执行第一条用例: testNG"); }
@Test
void testRun(){ System.out.println("执行第2条用例:testRun "); }
@Test
void testSub(){ System.out.println("执行第3条用例:testSub "); }
}
3.2 Test注解参数说明
-
a. 常用的:
groups: 用于将测试方法分组,可以在 XML 配置中选择性地执行指定组的测试。
timeOut: 指定方法的超时时间,单位为毫秒。
alwaysRun: 如果设置为 true,则无论依赖的方法是否失败,当前方法都会执行。
dependsOnMethods: 指定测试方法的依赖关系,被依赖的方法会在当前方法之前执行。
enabled: 控制测试方法是否启用,设置为 false 则禁用该方法。
description: 提供关于测试方法的简要描述。
invocationCount: 指定测试方法被调用的次数。 -
b. 数据驱动,需要结合@DataProvider注解对应获取参数的方法:
dataProvider: 指定使用哪个数据提供者来提供测试数据。
dataProviderClass: 指定数据提供者所在的类。 -
并发:
invocationCount: 指定测试方法被调用的次数。
threadPoolSize: 指定线程池的大小,用于并行执行测试方法。
timeOut:超时时间-毫秒
dataProviderThreadCount: 指定数据提供者线程的数量。
3.3 代码示例
import org.testng.annotations.Test;
public class checkNGTest {
@Test(groups="Performance")
public void testMethod1() { System.out.println("Test Method 1"); }
@Test(priority=1)
public void testMethod2() { System.out.println("Test Method 2"); }
@Test(dependsOnMethods = "testMethod4", alwaysRun = false)
public void testMethod3(){ System.out.println("Test Method 3"); }
@Test(timeOut = 3000)
public void testMethod4() throws InterruptedException {
Thread.sleep(4000);
System.out.println("Test Method 4");
}
@Test(enabled = false, description = "用于测试enable注解,=false 禁用该方法")
public void testMethod5() { System.out.println("Test Method 5"); }
}
4,常用断言
5,SoftAssert软断言
-
SoftAssert
的特点:- 如果一个断言失败,会继续执行这个断言下的其他语句或者断言。
- 也就是一个用例有多个断言,失败了其中一个,不影响其他断言的运行
- 不要忘记调用
assertAll()
在该用例的最后一个断言后面。
6, testng.xml
常用配置方式
//包维度
<packages>
<package name="examples.packageA"/>
<package name="examples.packageB"/>
</packages>
//分组维度控制
<groups>
<define name="all">
<include name="group01"/>
<include name="group02"/>
</define>
<run>
<include name="all"/>
<exclude name="group02"/>
</run>
</groups>
//类维度
<classes>
<class name="examples.packageA.ClassATest">
<methods>
<include name ="testCaseA01"></include>
<exclude name="testCaseA02"></exclude>
</methods>
</class>
</classes>
7,并发测试
- name :suite的名称,必须参数
- verbose:命令行信息打印等级,不会影响测试报告输出内容;可选值(1
- parallel : 是否多线程并发运行测试;可选值
(false | methods | tests | classes )
,默认 “false” - thread-count :当为并发执行时的线程池数量,默认为”5”
- time-out :为具体执行单元设定一个超时时间,具体参照parallel的执行单元设置;单位为毫秒