# JavaTestngDemo
**Repository Path**: r_-y/java-testng-demo
## Basic Information
- **Project Name**: JavaTestngDemo
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-07-26
- **Last Updated**: 2025-08-01
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 接口自动化测试框架 README
## 1. 项目概述
这是一个基于 **Java + TestNG + RestAssured** 的接口自动化测试框架,采用模块化设计,支持参数化测试、日志记录、Allure报告生成、邮件通知和企业微信通知等功能。
---
---
## 2. 项目结构详解
以下是带有说明的目录结构:
```
TestngDemo D:\TestngDemo
├── .allure # Allure报告相关配置或缓存文件夹
├── .idea # IntelliJ IDEA项目配置文件夹
├── .vercel # Vercel相关配置文件夹
├── allure-results # Allure测试报告生成的结果文件存放目录
├── logs # 日志文件目录
│ ├── api-test.log # 常规API测试日志文件
│ ├── api-test-2025-07-24.log # 按日期命名的API测试日志文件
│ └── api-test-2025-07-25.log # 按日期命名的API测试日志文件
├── src # 源代码目录
│ ├── main # 主代码目录
│ │ └── java # Java源代码目录
│ │ └── com.demo # 项目主包
│ │ ├── config # 配置相关类目录
│ │ │ ├── ApiConfig # API配置类
│ │ │ ├── ApiEndpoints # API端点配置类
│ │ │ ├── ApiHeaders # API请求头配置类
│ │ │ ├── ConfigLoader # 配置加载类
│ │ │ └── RestAssuredGlobalConfig # RestAssured全局配置类
│ │ ├── tests # 测试代码目录
│ │ │ ├── base # 基础测试类目录
│ │ │ │ └── BaseTest # 基础测试类
│ │ │ ├── cases # 测试用例目录
│ │ │ │ ├── DemoTest # 示例测试用例类
│ │ │ │ └── DemoTestNoData.java # 无数据的示例测试用例类
│ │ │ └── listeners # 测试监听器目录
│ │ │ └── TestListener # 测试监听器类
│ │ └── utils # 工具类目录
│ │ ├── EmailUtils # 邮件工具类
│ │ ├── LogUtils # 日志工具类
│ │ ├── TestResultHistory # 测试结果历史记录工具类
│ │ ├── WeChatUtils # 微信工具类
│ │ └── YamlUtils # YAML文件处理工具类
│ ├── resources # 资源文件目录,如配置文件等
├── target # 编译输出目录,存放编译后的class文件等
├── mvn # 可能与Maven相关的配置或脚本目录
├── pom.xml # Maven项目对象模型文件,管理项目依赖和构建配置
├── README.md # 项目的说明文档,介绍项目相关信息
├── test_result_history.txt # 测试结果历史记录文件,记录测试执行情况
└── TestNgDemo.iml # IntelliJ IDEA项目配置文件
```
---
## 3. 核心依赖说明
以下是项目中最关键的依赖项及其作用说明:
```xml
org.testng
testng
7.4.0
test
io.rest-assured
rest-assured
5.2.1
com.fasterxml.jackson.core
jackson-databind
2.15.0
com.fasterxml.jackson.dataformat
jackson-dataformat-yaml
2.15.0
org.slf4j
slf4j-api
1.7.36
org.apache.logging.log4j
log4j-core
2.17.2
org.apache.logging.log4j
log4j-api
2.17.2
org.apache.logging.log4j
log4j-slf4j-impl
2.17.2
io.qameta.allure
allure-testng
2.17.3
test
com.sun.mail
javax.mail
1.6.2
```
### 关键依赖说明:
1. **TestNG**:测试框架核心,支持参数化测试、分组测试等功能
2. **RestAssured**:简化REST API测试的Java库
3. **Jackson**:处理YAML测试数据(比SnakeYAML更强大,支持对象映射)
4. **Log4j2**:高性能日志系统,支持异步日志
5. **Allure**:生成美观的测试报告
6. **JavaMail**:用于测试结果邮件通知
## 4. 核心功能实现
### 4.1 YAML数据驱动测试实现
```java
// 使用Jackson处理YAML测试数据
public class YamlUtils {
private static final ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
static {
mapper.findAndRegisterModules(); // 注册Java时间模块等
}
// 从classpath加载YAML文件并转换为对象列表
public static List loadYamlListFromClasspath(String path, Class valueType) {
try {
return mapper.readValue(
YamlUtils.class.getClassLoader().getResourceAsStream(path),
mapper.getTypeFactory().constructCollectionType(List.class, valueType)
);
} catch (IOException e) {
throw new RuntimeException("Failed to load YAML file: " + path, e);
}
}
}
```
### 4.2 测试基类实现
```java
public class BaseTest {
protected static final Logger log = LogUtils.getLogger();
@BeforeSuite
public void setupGlobalConfig() {
// 初始化RestAssured配置
RestAssured.baseURI = ApiConfig.getBaseUrl();
RestAssured.config = RestAssuredGlobalConfig.getConfig();
// 初始化日志系统
LogUtils.initLog4j2();
}
@BeforeMethod
public void logTestStart(Method method) {
log.info("===== 开始执行测试: {} =====", method.getName());
}
@AfterMethod
public void logTestEnd(Method method) {
log.info("===== 结束执行测试: {} =====", method.getName());
}
}
```
### 4.3 测试监听器实现
```java
public class TestListener implements ITestListener {
@Override
public void onFinish(ITestContext context) {
// 统计测试结果
int total = context.getPassedTests().size()
+ context.getFailedTests().size()
+ context.getSkippedTests().size();
// 发送邮件通知
EmailUtils.sendTestReport(total,
context.getPassedTests().size(),
context.getFailedTests().size());
// 发送企业微信通知
WeChatUtils.sendTestResultNotification(total,
context.getPassedTests().size(),
context.getFailedTests().size());
}
}
```
---
## 5. 测试数据参数化示例
### 5.1 YAML测试数据文件
```yaml
# src/test/resources/testdata/user_testcases.yaml
- name: "获取用户列表-成功场景"
description: "使用有效参数获取用户列表"
request:
method: GET
path: "/api/users"
params:
page: 1
size: 10
expected:
statusCode: 200
responseTime: 500 # ms
- name: "获取用户列表-无效参数"
description: "使用无效页码获取用户列表"
request:
method: GET
path: "/api/users"
params:
page: -1
size: 10
expected:
statusCode: 400
```
### 5.2 测试用例实现
```java
public class UserApiTest extends BaseTest {
@Test(dataProvider = "userTestCases")
public void testUserApi(TestCase testCase) {
// 构建请求
RequestSpecification request = RestAssured.given()
.headers(ApiHeaders.getDefaultHeaders())
.params(testCase.getRequest().getParams());
// 发送请求并验证
Response response = request.request(testCase.getRequest().getMethod(),
testCase.getRequest().getPath());
// 验证响应状态码
assertEquals(response.statusCode(),
testCase.getExpected().getStatusCode());
// 记录请求响应日志
Allure.addAttachment("请求参数",
testCase.getRequest().getParams().toString());
Allure.addAttachment("响应内容",
response.asPrettyString());
}
@DataProvider
public Object[][] userTestCases() {
List testCases = YamlUtils.loadYamlListFromClasspath(
"testdata/user_testcases.yaml", TestCase.class);
return testCases.stream()
.map(tc -> new Object[]{tc})
.toArray(Object[][]::new);
}
}
```
---
## 6. 运行与报告
### 6.1 执行测试
```bash
# 执行所有测试
mvn clean test
# 执行特定分组
mvn test -Dgroups=smoke
mvn clean test -Dgroups=smokedata allure:report verify
# 生成Allure报告
mvn allure:serve
```
### 6.2 报告效果
生成的Allure报告包含:
- 测试用例分类展示
- 详细的请求/响应信息
- 历史趋势图
- 失败用例堆栈跟踪
- 测试步骤时间统计
---
## 7. 最佳实践
1. **测试数据管理**:
- 将测试数据与测试代码分离
- 使用YAML组织不同场景的测试数据
- 为测试数据添加清晰的描述字段
2. **日志记录**:
- 关键步骤使用INFO级别日志
- 调试信息使用DEBUG级别
- 请求/响应体作为附件记录
3. **异常处理**:
- 在工具类中统一处理异常
- 为测试数据加载失败提供有意义的错误信息
4. **CI/CD集成**:
- 在Jenkins/GitLab CI中配置定时任务
- 测试失败时立即通知团队
- 保留最近N次的测试报告
---
## 8. 常见问题解决
1. **YAML加载失败**:
- 检查文件路径是否正确
- 验证YAML格式是否正确
- 确保POJO类字段与YAML键匹配
2. **依赖冲突**:
- 使用`mvn dependency:tree`检查依赖树
- 排除冲突的传递依赖
3. **日志不输出**:
- 检查log4j2.xml配置
- 确认日志级别设置正确
- 检查日志目录写入权限
---