testng实现verify断言

本文介绍了如何构造一个Verify类来捕获并管理TestNG的Assert断言异常,通过监听器在测试方法结束时统一抛出异常。该方法适用于需要在测试执行后统一查看断言结果的场景。

1.构造一个Verify类,将testNg的Assert断言异常捕获,利用监听器在@Test方法结束后一次性抛出


2.编写Verify类,可按需求扩充

package com.p;

import org.testng.Assert;

public class Verify {
	public static StringBuffer verificationErrors= new StringBuffer();;

	public static void verifyTrue(boolean o) {
		try {
			Assert.assertTrue(o);
		} catch (Error e) {
			verificationErrors.append(e.toString());
		}
	}

	public static void verifyFalse(boolean o) {
		try {
			Assert.assertFalse(o);
		} catch (Error e) {
			verificationErrors.append(e.toString());
		}
	}

	public static void verifyEquals(Object expected, Object actuals) {
		try {
			Assert.assertEquals(expected, actuals);
		} catch (Error e) {
			verificationErrors.append(e.toString());
		}
	}

	public static void verifyEquals(Object expected, Object actuals,
			String message) {
		try {
			Assert.assertEquals(expected, actuals, message);
		} catch (Error e) {
			verificationErrors.append(e.toString());
		}
	}

<think>我们正在讨论TestNG框架下的接口自动化测试,特别是查询接口的测试。根据用户需求,我们需要提供示例代码及教程。参考引用[^1]中提到了数据驱动的核心:从数据文件中读取输入数据,将测试数据与测试脚本分离。这正好适用于接口测试,因为我们可以通过参数化来测试不同的查询条件。步骤:1.准备测试数据:例如,查询接口可能需要不同的参数组合,我们可以将这些参数存储在外部文件(如Excel、CSV或XML)中。2.使用TestNG的数据提供者(@DataProvider)来读取测试数据并传递给测试方法。3.编写测试方法(使用@Test注解),在方法中发送HTTP请求并验证响应。示例:假设我们有一个查询用户信息的接口,接口地址为:http://example.com/api/user,请求方法为GET,参数为userId。我们将使用TestNG和HttpClient来发送请求。首先,添加必要的依赖(Maven项目):```xml<dependencies><!--TestNG--><dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>7.4.0</version><scope>test</scope></dependency><!--HttpClient--><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency><!--JSON解析库,例如Gson--><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.8</version></dependency></dependencies>```然后,编写测试代码:1.创建一个数据提供者,从数据源(这里使用硬编码示例,实际可以从文件读取)获取测试数据。2.编写测试方法,使用数据提供者的数据发送请求,并检查响应。示例代码:```javaimportorg.apache.http.client.methods.CloseableHttpResponse;importorg.apache.http.client.methods.HttpGet;importorg.apache.http.impl.client.CloseableHttpClient;importorg.apache.http.impl.client.HttpClients;importorg.apache.http.util.EntityUtils;importorg.testng.Assert;importorg.testng.annotations.DataProvider;importorg.testng.annotations.Test;importjava.io.IOException;publicclassUserQueryTest{//数据提供者,返回测试数据@DataProvider(name="userIds")publicObject[][]provideUserIds(){returnnewObject[][]{{"1"},//存在的用户ID{"100"}//不存在的用户ID};}@Test(dataProvider="userIds")publicvoidtestQueryUser(StringuserId)throwsIOException{//构造请求URLStringurl="http://example.com/api/user?userId="+userId;//创建HttpClient对象try(CloseableHttpClienthttpClient=HttpClients.createDefault()){HttpGethttpGet=newHttpGet(url);//发送请求try(CloseableHttpResponseresponse=httpClient.execute(httpGet)){//获取响应状态码intstatusCode=response.getStatusLine().getStatusCode();//获取响应内容StringresponseBody=EntityUtils.toString(response.getEntity());//验证状态码Assert.assertEquals(statusCode,200,"状态码不是200");//根据业务验证响应内容,这里假设返回JSON,且包含success字段//使用Gson解析响应,这里简化,直接使用字符串包含判断//实际中应该解析JSONif("1".equals(userId)){Assert.assertTrue(responseBody.contains("\"success\":true"),"响应中不包含success:true");}else{Assert.assertTrue(responseBody.contains("\"success\":false"),"响应中不包含success:false");}}}}}```说明:-数据提供者方法`provideUserIds`返回一个二维数组,每一行是一组测试数据,这里我们测试两个userId。-测试方法`testQueryUser`接收一个参数userId,然后构造URL,发送HTTPGET请求。-我们验证了响应的状态码为200,并且根据userId的不同,验证响应体中包含相应的成功或失败标志(这里简化处理,实际应解析JSON)。进阶:从外部文件读取测试数据我们可以使用Excel或CSV文件存储测试数据。这里以CSV为例:创建一个CSV文件(testdata.csv),内容如下:```userId,expectedStatusCode,expectedSuccess1,200,true100,200,false```然后,编写一个数据提供者来读取CSV文件:```java@DataProvider(name="userData")publicObject[][]provideUserData()throwsIOException{List<Object[]>data=newArrayList<>();//读取CSV文件,这里使用简单方式,实际可以使用OpenCSV等库BufferedReaderbr=newBufferedReader(newFileReader("src/test/resources/testdata.csv"));Stringline;br.readLine();//跳过标题行while((line=br.readLine())!=null){String[]values=line.split(",");data.add(newObject[]{values[0],Integer.parseInt(values[1]),Boolean.parseBoolean(values[2])});}br.close();returndata.toArray(newObject[0][]);}@Test(dataProvider="userData")publicvoidtestQueryUserWithDataFromCSV(StringuserId,intexpectedStatusCode,booleanexpectedSuccess)throwsIOException{//构造请求URLStringurl="http://example.com/api/user?userId="+userId;try(CloseableHttpClienthttpClient=HttpClients.createDefault()){HttpGethttpGet=newHttpGet(url);try(CloseableHttpResponseresponse=httpClient.execute(httpGet)){intstatusCode=response.getStatusLine().getStatusCode();StringresponseBody=EntityUtils.toString(response.getEntity());Assert.assertEquals(statusCode,expectedStatusCode,"状态码不符合预期");//解析JSON,这里假设响应格式为:{"success":true,...}JsonObjectjsonObject=newGson().fromJson(responseBody,JsonObject.class);booleanactualSuccess=jsonObject.get("success").getAsBoolean();Assert.assertEquals(actualSuccess,expectedSuccess,"success字段不符合预期");}}}```这样,测试数据与代码分离,方便维护。教程总结:1.使用TestNG的@DataProvider提供测试数据。2.在测试方法中发送HTTP请求(这里使用HttpClient)。3.解析响应并验证结果(状态码和业务字段)。4.将测试数据外部化,提高测试脚本的可维护性。注意:实际项目中,建议将HTTP请求封装成工具类,以及使用更健壮的数据读取方式。§§相关问题§§1.TestNG中如何管理测试依赖?2.在TestNG中如何处理接口测试中的认证(如token)?3.TestNG如何与持续集成工具(如Jenkins)集成?</think>### 使用TestNG实现查询接口自动化测试 #### 核心步骤及示例代码 以下是基于TestNG的查询接口自动化测试实现框架,采用数据驱动模式(参考[^1]): ```java import org.testng.annotations.*; import io.restassured.RestAssured; import io.restassured.response.Response; import static org.testng.Assert.*; public class QueryAPITest { // 基础配置 @BeforeClass public void setup() { RestAssured.baseURI = "https://api.example.com"; // 设置API基础地址 } // 数据驱动测试(参数化) @Test(dataProvider = "queryData") public void testQueryAPI(String id, int expectedStatus, String expectedKey) { // 发送GET请求并获取响应 Response response = RestAssured.given() .queryParam("id", id) // 查询参数 .when() .get("/users"); // 接口路径 // 验证响应 assertEquals(response.getStatusCode(), expectedStatus, "状态码校验失败"); assertTrue(response.jsonPath().getString("data.key").contains(expectedKey), "关键字段校验失败"); // 可选:输出响应日志 System.out.println("响应数据:" + response.asPrettyString()); } // 数据提供器(支持外部数据源) @DataProvider(name = "queryData") public Object[][] provideTestData() { return new Object[][] { // { 测试ID, 预期状态码, 预期包含字段 } {"1001", 200, "userName"}, {"invalid_id", 404, "error"}, {"", 400, "missing_parameter"} }; } } ``` #### 关键组件说明 1. **数据驱动机制** - 通过`@DataProvider`实现参数化测试 - 测试数据与脚本分离(可扩展为从Excel/CSV读取) - 支持多场景覆盖:有效ID、无效ID、空参数等 2. **断言验证** - 状态码验证:`assertEquals(response.getStatusCode(), expectedStatus)` - 业务字段验证:`response.jsonPath().getString(...)` - 异常情况处理:错误码和错误信息校验 3. **测试配置** - `@BeforeClass`:初始化测试环境 - RestAssured:简化HTTP请求处理 - 日志输出:调试和结果追踪 #### 最佳实践建议 1. **数据管理优化** ```java // 从CSV文件读取测试数据 @DataProvider(name = "externalData") public Iterator<Object[]> loadCSVData() throws IOException { List<Object[]> data = new ArrayList<>(); BufferedReader br = new BufferedReader(new FileReader("testdata.csv")); String line; while ((line = br.readLine()) != null) { String[] values = line.split(","); data.add(new Object[]{values[0], Integer.parseInt(values[1]), values[2]}); } return data.iterator(); } ``` 2. **测试后置处理** ```java @AfterTest public void cleanTestData() { // 清理测试产生的临数据 // 示例:删除测试创建的用户 RestAssured.delete("/users/1001"); } ``` 3. **断言增强** ```java // 使用Hamcrest增强断言 response.then() .statusCode(200) .body("data.size()", equalTo(10)) // 验证返回数据量 .body("data.findAll { it.age > 18 }.size()", greaterThan(5)); // 验证业务规则 ``` 4. **认证处理** ```java // 添加认证信息 .given() .header("Authorization", "Bearer " + getToken()) ``` #### 执行流程 ```mermaid graph TD A[启动测试] --> B[初始化API基础地址] B --> C[加载测试数据] C --> D{遍历测试用例} D --> E[发送查询请求] E --> F[验证响应状态] F --> G[验证业务数据] G --> H[记录测试结果] H --> D D --> I[生成测试报告] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值