# 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配置 - 确认日志级别设置正确 - 检查日志目录写入权限 ---