zoukankan      html  css  js  c++  java
  • 快速搞定APP移动端自动化测试

    1. 何为数据驱动

    什么是参数化?什么又是数据驱动?经常有人会搞不明白他们的关系,浅谈一下个人的理解,先来看两个测试中最常见的场景:

    登录:不同的用户名,不同的密码,不同的组合都需要做登录场景的测试,正常的排列组合下可能会产生多个用例

    搜索:不同的搜索条件产生不同的搜索结果,搜索也是常见的测试项,单个搜索参数或者多种搜索参数的组合;同样也会产生多个用例。

    以上两种场景都有一个共同点,就是测试的执行步骤不变,变的只是输入的测试数据,那么引出两个概念——参数化和数据驱动

    参数化:我们在写自动化用例的时候会有很多方法,一般我们都会把数据通过参数来传递给方法,而不会直接在方法中写“死”,所以方法之间的数据传递都是通过参数化来进行,利用参数化进行数据与变量的对应;比如我们的登录账号密码设置在参数中,再将参数传递到方法中。

    public MainPage login(String username, String password) {
    sendKeys(inputUsername,username);
    sendKeys(inputPassword,password);
    click(loginBtn);
    return new MainPage();
    }

    数据驱动:将参数化中的数据来源变成从外部读取,参数有一个存放数据的地方,在用例执行的时候去去数据;这个数据存储的地方可以是我们定义的数组、hashmap,也可以是从外部文件中(excel、csv、xml、yaml等)读取。

    例如上述的搜索案例,我们可以将搜索条件放入外部文件中,每次执行搜索用例时,去文件中获取数据,根据获取到的数据执行不同的搜索测试即可。

    -
    - 洗衣液
    -
    - 帽子
    -
    - 手套

    总结下来:

    数据驱动为自动化测试框架的一种设计思想,而参数化是实现数据驱动的一种手段,我们利用参数化来完成数据驱动,从而将数据与脚本分离,增加了框架的可维护性和脚本的复用性。

    2. 为什么要做数据驱动

    2.1 测试数据

    在执行测试工作过程中,有很多过程是需要动态变化的,如果每一次的变化都需要编码部署,那么整个执行的流程就会边长;

    对于业务测试工程师来说,维护自动化代码有一定的门槛,需要熟悉编程语言和测试框架的结构;

    定义好了数据驱动,将变化的数据放入配置文件中进行维护,既便捷(无需找到对应代码修改部署),也降低了维护的门槛(业务测试只需要在配置文件中修改数据即可)

    2.2 测试步骤

    与测试数据的数据驱动大致相同,主要也是方便业务测试维护,降低维护门槛和代码修改部署出错的风险;修改配置文件,整个业务行为和抽象是不用改变的,当然,在UI自动化中配合PO一起使用会“风味更佳”。

    2.3 动态生成测试步骤

    手工录制测试步骤,直接生成代码比较困难,可以生成步骤的配置文件,让代码去读配置文件,完成自动化的回放;(此方面本人暂时仅了解过,还未实践落地,理论上是可以实现的。)

    3. 在哪里做数据驱动

    3.1 不要在哪里做数据驱动

    不要在测试用例内完成大量的数据驱动:用例通过PO的调用是能够非常清晰展现出业务执行场景的,业务才是用例的核心;一旦在用例里使用了大量数据驱动,如调用各种yaml、csv等数据文件,会造成用例可读性变差,维护复杂度变高;

    3.2 可以在哪里做数据驱动

    1. 测试数据的数据驱动

    2. 测试步骤的数据驱动

    • 定位符
    • 行为流

    3. 断言的数据驱动

    4. 如何做数据驱动

    4.1 数据格式的选择

    我们要将数据存入文件中,不同的文件有着不同的数据格式,那么作何选择呢?

    • 不同数据格式文件的对比
    快速搞定APP移动端自动化测试

     

    从上述对比结果中,Json 和 YAML 对于数据结构的支持和书写程度是较好的;但是, YAML 的写法更简洁,并且还可以注释,因此最推荐使用的就是(从表格中的所处都位置也可猜到~)…位于C位的YAML!

    那么到底什么是YAML,又如何使用,下面简单来了解一下

    4.2 YAML 文件的使用

    yaml 的语法

    • 大小写敏感
    • 使用缩进表示层级关系
    • 缩进时不允许使用Tab键,只允许使用空格。
    • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
    • # 表示注释

    yaml 支持的三种数据结构

    • 纯量(scalars):单个的、不可再分的值,例如数字、字符串、布尔值等
    • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
    #键值对形式
    key: value
    #行内对象
    person: { name: allen, age: 25 }
    • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
    #以-开头表示为一个数组里的值
    - A
    - B
    - C
    #数组内嵌套子数组,用一个空格缩进表示
    -
    - a
    - aa
    -
    - b
    - bb
    • 对象和数组可以结合使用,形成复合结构
    languages:
    - Ruby
    - Perl
    - Python
    websites:
    YAML: yaml.org
    Ruby: ruby-lang.org
    Python: python.org
    Perl: use.perl.org

    4.3 数据读取-jackson

    既然有了数据存储的地方,那么就要对数据进行读取,这里就要介绍另一位帮手,Java的jackson库

    jackson是Java的一个库,用的最多的是jackson-databind和jackson-dataformats-text,分别用来处理json和yaml数据格式,它可以将文件中的数据和Java中的对象建立一种映射关系,

    把一个文件数据通过类型建立关联,并创建出一个类的实例,反之也可以把一个对象写入文件中。

    4.3.1 jackson-databind

    先来看jackson-databind对json文件的操作

    添加 maven 依赖

    <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.9.3</version>
    </dependency>
    • 写 json 文件

    1)先创建一个类,包含变量name,age

    public class TestFileSource {
    public String name;
    public int age;
    }

    2)创建单元测试,创建ObjectMapper对象,调用writeValue对json文件进行写操作

    @Test
    void writeJson() throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    TestFileSource testFileSource = new TestFileSource();
    mapper.writeValue(new File("..\demo.json"),testFileSource);
    }

    3)得到demo.json文件的结果,从结果可以看到TestFileSource类中的变量已经被写入的json文件中

    {"name":null,"age":0}
    • 读 json 文件

    1)创建单元测试,创建ObjectMapper对象,调用readValue方法对json文件进行数据读取

    @Test
    void readJson() throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    TestFileSource testFileSource = mapper.readValue(TestFileSource.class.getResourceAsStream("/demo.json"), TestFileSource.class);
    System.out.println(testFileSource);
    System.out.println(testFileSource.age);
    }

    2)读取结果

     ApiDemos.testcase.TestFileSource@4562e04d
    0
    • 输出漂亮的 json 格式

    1)创建单元测试,创建ObjectMapper对象,调用
    writerWithDefaultPrettyPrinter().writeValueAsString方法可对指定对象进行json数据格式的输出

    @Test
    void prettyPrintJson() throws JsonProcessingException {
    ObjectMapper mapper = new ObjectMapper();
    // pretty print
    String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(new TestFileSource());
    System.out.println(json);
    }

    2)打印结果

    {
    "name" : null,
    "age" : 0
    }

    参考链接jackson-databind GitHub地址:

    https://github.com/FasterXML/jackson-databind

    4.3.2 jackson-dataformats-text

    再来看jackson-dataformats-text,这是一个可以对YAML、CSV、Properties和XML文件进行操作的库,也是目前最常用的,不过这里我们只重点关注其对YAML文件的操作

    • 添加maven依赖
    <dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
    <version>2.9.8</version>
    </dependency>
    • 读 YAML 文件

    想要读取 YAML 文件,最主要的是在new ObjectMapper对象的时候加入new YAMLFactory(),这样就成功切换至 yaml 操作的状态,然后利用readValue方法就可以完成对yaml文件的数据读取了

    1)创建 YAML 文件

    name: allen
    age: 11

    2)创建ObjectMapper对象,设置new YAMLFactory()

    @Test
    void readYaml() throws IOException {
    ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
    TestFileSource testFileSource = mapper.readValue(TestFileSource.class.getResourceAsStream("/demo2.yaml"), TestFileSource.class);
    System.out.println(testFileSource);
    System.out.println(testFileSource.age);
    }

    打印结果

    ApiDemos.testcase.TestFileSource@ba2f4ec
    11

    在readValue的方法中可以看到,第一个参数填的是文件地址,第二个参数就是精髓所在!我们可以给定一个对象类型,或者一个二维数组等,用来产生映射关系,将文件数据和我们的对象绑定,方便数据的读取。

    如上述例子中我们通过TestFileSource的实例化对象来调用age变量。

    • 输出漂亮的 YAML 格式

    与json输出的方式基本一致,只需要在new ObjectMapper对象的时候加入new YAMLFactory()即可1)创建类和类的成员变量,包含纯量、数组和哈希

    public class TestFileSource {

    public String name = "tester";
    public int age = 2;
    public Object[][] arr= {{1,2,3,},{"a","b","c"}};
    public HashMap<String,Object> map = new HashMap<String, Object>(){
    {
    put("name","tester");
    put("sex","男");
    }
    };
    }

    2)创建单元测试,创建ObjectMapper对象,加入new YAMLFactory() 参数,调用
    writerWithDefaultPrettyPrinter().writeValueAsString方法可对指定对象进行yaml数据格式的输出

    @Test
    void prettyPrintYaml() throws JsonProcessingException {
    ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
    // pretty print
    String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(new TestFileSource());
    System.out.println(json);
    }

    3)打印结果

    ---
    name: "tester"
    age: 2
    arr:
    - - 1
    - 2
    - 3
    - - "a"
    - "b"
    - "c"
    map:
    sex: "男"
    name: "tester"

    (文章来源于霍格沃兹测试学院)

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
  • 原文地址:https://www.cnblogs.com/hogwarts/p/12981241.html
Copyright © 2011-2022 走看看