自动化测试方案
自动化测试框架图
- 测试用例使用单元测试框架
- 测试业务使用 Page-Object 设计模式
- 测试数据使用 数据驱动的方式 进行传入
- flat-file
- csv
- xml
- txt
- ...
- DataBase
- MySQL
- SQL Server
- MongoDB
- flat-file
- 底层封装 WebDriver
测试用例组织与执行
- 测试集合 test suite
- 测试用例的集合
- 多个测试用例的类
- 测试用例类的方法
- 测试用例的集合
- 测试运行 运行 test suite
TestNG
testng.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Default Suite">
<test name="SolutionSelenium">
<classes>
<class name="cases.LoginTests">
<methods>
<!-- 添加指定的测试 -->
<include name="testLoginByCsv"/>
<include name="testLoginByCsv2"/>
<include name="testLoginByCsv3"/>
</methods>
</class> <!-- cases.LoginTests -->
<class name="cases.AdminTests">
<methods>
<!-- 去除指定的测试 -->
<exclude name="testAddMember"/>
</methods>
</class>
</classes>
</test> <!-- SolutionSelenium -->
</suite> <!-- Default Suite -->
-
- 指定测试的类
- 指定测试的类中的方法
- include: 一个个方法包含进来
- exclude: 去除指定的方法
Main.java
public class Main {
public static void main(String[] args) {
TestNG test = new TestNG();
List<String> suites = new ArrayList<>();
suites.add("testng.xml");
test.setTestSuites(suites);
test.run();
}
}
测试报告
TestNG 自带的测试报告 xml / html
ReportNG 测试报告的插件,停止开发和支持。
Report detail page.
ExtentReport 测试报告
- TestNG有默认的测试报告生成器 Listener
- 使用 ExtentReport 重写一个 Listener
- 让 TestNG 使用我们写好的 Listener 生成报告
步骤
引入 ExtentReport 到 pom.xml
<dependency>
<groupId>com.relevantcodes</groupId>
<artifactId>extentreports</artifactId>
<version>2.41.2</version>
</dependency>
- 目前 ExtentReport 有两个版本:2 和 3
- 3 有付费版和开源版
- 2 全部开源的
- 官方网址:http://extentreports.com/community/
编写 Listener : ExtentReporterNgListener
@Override
public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory) {
Date date = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd_HHmmss");
String time = formatter.format(date);
String reportName = String.format("ExtentReportTestNG_%s.html", time);
// 创建报告
// NetworkMode.OFFLINE 支持断网查看报告
this.extent = new ExtentReports(
outputDirectory + File.separator + reportName,
true, NetworkMode.OFFLINE);
for (ISuite suite : suites) {
Map<String, ISuiteResult> result = suite.getResults();
for (ISuiteResult r : result.values()) {
ITestContext context = r.getTestContext();
// 创建测试节点
buildTestNodes(context.getPassedTests(), LogStatus.PASS);
b