写作背景:有点Java基础的功能测试人员(点点点工程师),所在项目有"去QE"的趋势,所以自己要多点亮其他技能,让路子走宽点。
简单说一下去QE:项目测试不再有专职的测试工程师来做,而是由开发工程师自己来进行。遵循“谁开发、谁测试、谁上线、谁On call”的原则。
一、Java、TestNG、JSONAssert都是什么
1.1、Java基础教程
我先复习Java的基本简介、语法、写法、使用。参考资料
- 安装java 开发工具包:JDK8 或更高版本
- 配置环境变量
- 安装java开发工具:IDEA
- Java基本语法:对象、类、实例、方法、实例变量、标识符【类名| 变量名| 方法名】、修饰符【用于修饰类中方法和属性】、变量【局部变量| 类变量/静态变量| 成员变量/非静态变量】、数组、枚举、关键字、注释、空行、继承、接口。
- Java命名规范:大小写敏感、类名首字母大写的驼峰式、方法名首字母小写的驼峰式、源文件名必须和类名相同
- Java基本概念:多态、集成、封装、抽象、类、对象、实例、方法、重载等等
- Java基本类型(八种):byte、short、int、long、float、double、boolean、char
- Java的运算符、循环结构、条件语句、switch case、Number & Math 类、Character 类、String 类、StringBuffer 和 StringBuilder 类、数组、日期时间、正则表达式、方法、流(Stream)、文件(File)和IO、Scanner 类、异常处理等等
- Java的数据结构、集合框架、ArrayList、LinkedList、HashSet、HashMap、Iterator(迭代器)、Object 类、泛型、序列化等等
- Java的网络编程、发送邮件 、多线程编程 、Applet 基础、文档注释、实例等等
1.2、TestNG
- TestNG基本解释:(即Testing,Next Generation,即下一代测试技术)是Java中的一个开源自动化测试框架。它的灵感来源于JUnit。它的目的是优于JUnit,尤其是在用于测试集成多类时。它借鉴了Java的注解。它旨在涵盖所有类别的测试:单元,功能,端到端,集成等…
详细使用说明请参考:TestNG官方链接。 - TestNG基本特点:【注解】、【使用Java面向对象的功能】、【支持综合类测试】、【独立的编译时代码自检审核和运行时配置/数据信息】、【支持编译测试不同优先级、不同类别的用例】、【灵活的插件API】、【支持多线程测试】等
- 使用注解的好处:
a、TestNG通过查找注释/注解来识别它感兴趣的方法。 因此,方法名称不限于任何模式或格式
b、可以将其他参数传递给注释。
c、注释是强类型的,所以编译器会马上标记任何错误。
d、测试类不再需要扩展任何东西(如TestCase,对于JUnit3)。
1.3、TestNG支持的注释列表:
注解 | 描述 |
---|---|
@BeforeSuite | 在该套件的所有测试都运行在注释的方法之前,仅运行一次。 |
@AfterSuite | 在该套件的所有测试都运行在注释方法之后,仅运行一次。 |
@BeforeClass | 在调用当前类的第一个测试方法之前运行,注释方法仅运行一次。 |
@AfterClass | 在调用当前类的第一个测试方法之后运行,注释方法仅运行一次 |
@BeforeTest | 注释的方法将在属于<test> 标签内的类的所有测试方法运行之前运行。 |
@AfterTest | 注释的方法将在属于<test> 标签内的类的所有测试方法运行之后运行。 |
@BeforeGroups | 配置方法将在之前运行组列表。 此方法保证在调用属于这些组中的任何一个的第一个测试方法之前不久运行。 |
@AfterGroups | 此配置方法将在之后运行组列表。该方法保证在调用属于任何这些组的最后一个测试方法之后不久运行。 |
@BeforeMethod | 注释方法将在每个测试方法之前运行。 |
@AfterMethod | 注释方法将在每个测试方法之后运行。 |
@DataProvider | 标记一种方法来提供测试方法的数据。注释方法必须返回一个Object [] [] ,其中每个Object [] 可以被分配给测试方法的参数列表。DataProvider 接收数据的@Test 方法需要使用与此注释名称相等的dataProvider 名称。 |
@Factory | 将一个方法标记为工厂,返回TestNG 将被用作测试类的对象。 该方法必须返回Object [] 。 |
@Listeners | 定义测试类上的监听器。 |
@Parameters | 描述如何将参数传递给 @Test 方法。 |
@Test | 将类或方法标记为测试的一部分。 |
1.4、JSONAssert
- 将字符串转换为JSON对象,并将逻辑结构和数据与实际JSON进行比较。一个专注于理解 JSON 数据并使用该数据编写复杂 JUnit 测试的库。
- 当strict(严格模式)设置为false(推荐设置)时,它会允许数据重排序以及结果可扩展(只要对比的JSON包含了所有预期JSON的所有字段),从而使测试不那么脆弱。建议关掉严格模式,除非你要求比较的JSON与预期的JSON中数组顺序相同,或者要求两者具有相同的字段。
/**
* Asserts that the JSONObject provided matches the expected string. If it isn't it throws an
* {@link AssertionError}.
*
* @param expectedStr Expected JSON string
* @param actual JSONObject to compare
* @param strict Enables strict checking
* @throws JSONException JSON parsing error
*/
public static void assertEquals(String expectedStr, JSONObject actual, boolean strict)
throws JSONException {
assertEquals(expectedStr, actual, strict ? JSONCompareMode.STRICT : JSONCompareMode.LENIENT);
}
二、搭建框架(创建maven项目,配置testng依赖)
2.1、创建普通maven项目即可
2.2、在pom.xml中配置依赖
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>${testng.version}</version>
</dependency>
</dependencies>
2.3、下载依赖(pom文件重新加载项目)
三、创建Demo测试类和方法
直接复制官网中的simple:
package com.demo.apitest.testcase;
import org.testng.annotations.*;
public class DemoTest {
@BeforeClass
public void setUp() {
// code that will be invoked when this test is instantiated
}
@Test(groups = {"fast"})
public void aFastTest() {
System.out.println("Fast test");
}
@Test(groups = {"slow"})
public void aSlowTest() {
System.out.println("Slow test");
}
}
四、两种方式运行(直接运行、xml方式运行)
4.1、直接运行
4.2、xml方式运行
IDEA创建的项目默认不会生成testng.xml(用于控制测试执行的执行)文件,就需要在根目录手动创建该文件,同时需要在pom.xml文件中关联设置testng.xml。testng.xml写法参考官网:
基本格式如下:
- 每一个xml文件只能有一个suite,代表的是一个测试集;
- 一个suite中可包含多个test,默认情况下,多个test会顺序执行。若希望多个test以不可预知的顺序运行,可将preserve-order 属性设置为false;
- 每一个test里边可以写需要运行的测试用例的class。如果不写,默认会跑所有的测试用例;
- 每个class可以指定要执行哪些用例,不执行哪些用例。如果不写method,则默认本类里的全部用例都执行。
五、实际应用中的常见用例写法
常见项目结构
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com.demo.apitest # 框架公共服务模块
│ │ │ └── annotations # 注释
│ │ │ └── api # 后端接口定义
│ │ │ └── enums # 枚举
│ │ │ └── model # Model
│ │ │ └── service # 公共方法
│ │ │ └── utils # 公共工具方法
│ │ └── resources
│ │ ├── driver # selenium的chrome驱动,用于本地登陆获取cookie
│ │ └── application.yml # 配置文件
│ └── test
│ ├── java
│ │ ├── com.demo.apitest # 框架公共服务模块
│ │ │ └── testcase # 接口测试脚本
│ │ └── MyBaseTestNg.java # testng基础测试类,所有测试脚本的父类
│ └── resources
│ └── testdata # 接口测试数据
└── testng.xml # testng测试套件配置
延伸下,在src.main.resources 目录下可创建一个 application .yml文件,用于配置公共参数,普通类型参数可使用 @value注解获取,list类型参数可使用@ConfigurationProperties注解获取
/ / T o D o L i s t 待补充 \color{red}{//ToDoList待补充} //ToDoList待补充
六、扩展:TestNG的常见测试场景
- 预期异常测试
- 忽略测试
- 超时测试
- 分组测试
- 套件测试(一起运行多个测试类)
- 依赖测试
- 参数化测试
- 参数测试实例