当前位置: 主页 > JAVA语言

java接口自动化测试框架-java 集合框架接口

发布时间:2023-02-09 16:18   浏览次数:次   作者:佚名

在设计自动化测试框架java接口自动化测试框架,我们经常将测试数据保存在外部文件(如Excel、YAML、CSV)或数据库中,以实现脚本和数据的解耦,方便后期维护。 目前很多自动化测试框架都是使用Excel或者YAML文件直接编写测试用例,通过脚本读取来驱动自动化测试代码的执行。 至于是用Excel还是YAML格式,每个人都有不同的看法。 例如使用Excel,维护直观,修改数据方便。 缺点是不易通过Git等版本控制工具比较历史版本差异(因为是二进制格式); YAML 的优点 支持完整的数据格式和方便的版本控制管理(文本格式)。 缺点是不如Excel直观。 Excel方法大家都很熟悉了。 本文将带你了解如何设计一个基于YAML的自动化测试框架。

YAML格式测试用例设计

以接口自动化为例,通过YAML编写测试用例要实现的基本功能需求:

一个YAML文件可以支持多个用例的存储需求,否则数千个用例对应数千个YAML文件,无法管理。 用例可以支持单接口测试用例,也可以支持业务场景用例(多个接口调用的组合)。 需要包含所属模块、用例名、请求信息、断言信息、抽取响应(实现接口关联)等信息。

基于以上需求,我们设计了一个版本的YAML格式用例:

- casename: 登录成功
  module: 用户模块
  teststeps:
    - name: 正确用户名、密码进行登录
      request:
        method: POST
        url: /login
        headers:
          Content-Type: application/json
        json:
          username: lemon_auto
          password: lemon123456
          appType: 3
          loginType: 0
      extract:
        token: access_token
      validate:
        - eq: ["status_code", 200]
        - eq: ["nickName", "lemon_auto"]
复制代码

casename 和 module 字段很简单。 让我们看看测试步骤。 为什么 teststeps 是数组类型?

因为一个用例包含一个/多个接口请求步骤,即一个TestCase包含多个测试步骤,每个测试步骤都是一个接口请求。

request指定接口请求信息,包括接口请求方法、请求地址、请求头、请求参数; 其中,我们需要区分不同的请求参数类型。 以上是json参数传递。 如果是form表单和query参数传递参数,我们都可以约定一个类似的key-value结构,把json改成formparam和queryparam就行了。

需要注意的是java接口自动化测试框架,文件上传接口的参数会比较特殊。 一般来说,我们只需要设置上传文件的路径即可,所以我们可以这样设计:

java接口自动化测试框架_java 集合框架接口_java接口自动化框架

- casename: 上传图片
  module: 用户模块
  teststeps:
    - name: 正常上传图片
      request:
        method: POST
        url: /p/file/upload
        headers:
          Content-Type: multipart/form-data
        file: src/test/resources/upload.png
      extract:
        resourcesUrl: resourcesUrl
        filePath: filePath
      validate:
        - eq: [ "status_code", 200 ]
复制代码

extract字段是响应数据字段,需要提取出来传递给后续接口使用。 一般我们需要支持JsonPath表达式或者正则表达式来提取,对应的key就是要提取的字段名,对应的value就是要提取的字段表达式。

validate字段为断言信息,用于验证响应结果是否符合预期。 这里需要支持常用的判断方法包括:等于、大于、小于、大于等于、小于等于,并使用缩写eq而不是equals(等于)来判断,其他类似: 大于或等于 (ge)、小于或等于 (le)、小于 (lt)、大于 (gt)。

以上是单接口测试用例。 再来看看多接口系列(业务场景)测试用例的写法:

修改用户配置文件.yaml

- casename: 修改用户头像
  module: 用户模块
  teststeps:
    - name: 登录成功
      request:
        method: POST
        url: /login
        json:
          username: lemon_auto

java接口自动化框架_java 集合框架接口_java接口自动化测试框架

password: lemon123456 appType: 3 loginType: 0 headers: Content-Type: application/json extract: token: access_token validate: - eq: ["status_code", 200] - eq: ["nickName", "lemon_auto"] - name: 进入到个人中心 request: method: GET url: /p/user/userInfo headers: Authorization: ${token} validate: - eq: ["status_code", 200] - name: 上传头像 request: method: POST url: /p/file/upload headers: Authorization: ${token} Content-Type: multipart/form-data file: src/test/resources/upload.png extract:

java接口自动化框架_java接口自动化测试框架_java 集合框架接口

resourcesUrl: resourcesUrl filePath: filePath validate: - eq: ["status_code", 200] 复制代码

多接口测试最重要的是能够支持参数传递。 这里我们使用extract将之前接口中接口的response字段提取出来,在后面要用到的接口中使用${token}引用。 熟悉Jmeter接口测试工具的同学应该对这种格式非常熟悉。

读取 YAML 数据的脚本

在读取YAML文件数据之前,我们首先需要了解两个概念:序列化和反序列化

而我们读取YAML的过程就可以称为反序列化。

主流的编程语言都可以实现对YAML的解析,下面以Java语言为例说明如何读取YAML文件的内容:

Java中有很多库可以实现YAML序列化和反序列化,包括SnakeYaml、Jackson、jYaml等,它们在使用上大同小异。 以杰克逊为例:

第一步:将库的坐标添加到Maven POM文件中

<dependency>
    <groupId>com.fasterxml.jackson.coregroupId>
    <artifactId>jackson-databindartifactId>
    <version>2.10.2version>
dependency>
<dependency>
    <groupId>com.fasterxml.jackson.dataformatgroupId>
    <artifactId>jackson-dataformat-yamlartifactId>
    <version>2.10.2version>
dependency>
<dependency>
    <groupId>org.projectlombokgroupId>
    <artifactId>lombokartifactId>
    <version>1.18.12version>
    <scope>providedscope>
dependency>

java接口自动化测试框架_java 集合框架接口_java接口自动化框架

复制代码

这里用到了jackson-databind和jackson-dataformat-yaml,其中jackson-databind是Jackson的主库,jackson-dataformat-yaml是支持YAML数据格式的库。 这里也引入了Lombok,方便后面写实体类的时候简化写一些代码:

Lombok 可以帮助我们简化一些必要但臃肿的 Java 代码工具(比如 get/set 方法)。 通过使用相应的注解,可以在编译源代码时自动生成相应的方法。

第二步:编写YAML实体类

比较YAML文件的内容,比如字段名(如“name”)和字段的数据类型(如字符串),创建对应的类来表示Java中YAML文件的信息。 目的是能够将 YAML 文件保存到 Java 对象中(反序列化)。

TestCase实体类:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class TestCase {
    private String casename;
    private String module;
    private List<Teststep> teststeps;
}
复制代码

测试步骤实体类:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Teststep {
    private String name;
    private Request request;
    private HashMap<String,String> extract;
    private List<Validate> validate;
}
复制代码

验证实体类:

@Data
@NoArgsConstructor

java接口自动化测试框架_java接口自动化框架_java 集合框架接口

@AllArgsConstructor public class Validate { private List<Object> eq; private List<Object> gt; private List<Object> ge; private List<Object> lt; private List<Object> le; } 复制代码

通过Jackson读取YAML文件内容,保存到TestCase实体类对象中

public static List<TestCase> loadYaml(String path){
    ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
    List<TestCase> cases = null;
    try {
        cases = objectMapper.readValue(new File(path), new TypeReference<List<TestCase>>() {});
    } catch (IOException e) {
        System.out.println(path+"格式非法,请检查配置");
        e.printStackTrace();
    }
    return cases;
}
复制代码

其中new TypeReference>() {}是因为读取的YAML文件中有多个TestCase用例,所以我们需要将其定义为List集合类型来接收。

我们来看看阅读后的效果:

java 集合框架接口_java接口自动化框架_java接口自动化测试框架

然后可以使用返回的testCase发起接口请求(例如通过REST-assured),进行接口断言,提取响应字段等操作。

最后,我要感谢所有仔细阅读我文章的人。 互惠总是必要的。 虽然不是很值钱的东西,但是需要的时候可以带走:

java接口自动化测试框架_java接口自动化框架_java 集合框架接口

更多面试题,点击链接领取《软件测试全套基础/高级/转行资料》