安徽省做网站,php网站开发实例编程,商城英文,网址seo查询1. 何为数据驱动什么是参数化#xff1f;什么又是数据驱动#xff1f;经常有人会搞不明白他们的关系#xff0c;浅谈一下个人的理解#xff0c;先来看两个测试中最常见的场景#xff1a;登录#xff1a;不同的用户名#xff0c;不同的密码#xff0c;不同的组合都需要做…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 数据格式的选择我们要将数据存入文件中不同的文件有着不同的数据格式那么作何选择呢不同数据格式文件的对比从上述对比结果中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.org4.3 数据读取-jackson既然有了数据存储的地方那么就要对数据进行读取这里就要介绍另一位帮手Java的jackson库jackson是Java的一个库用的最多的是jackson-databind和jackson-dataformats-text分别用来处理json和yaml数据格式它可以将文件中的数据和Java中的对象建立一种映射关系把一个文件数据通过类型建立关联并创建出一个类的实例反之也可以把一个对象写入文件中。4.3.1 jackson-databind先来看jackson-databind对json文件的操作添加 maven 依赖com.fasterxml.jackson.core jackson-databind 2.9.9.3写 json 文件1)先创建一个类包含变量nameagepublic class TestFileSource { public String name; public int age; }2)创建单元测试创建ObjectMapper对象调用writeValue对json文件进行写操作Testvoid 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文件进行数据读取Testvoid 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.TestFileSource4562e04d 0输出漂亮的 json 格式1)创建单元测试创建ObjectMapper对象调用writerWithDefaultPrettyPrinter().writeValueAsString方法可对指定对象进行json数据格式的输出Testvoid 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-databind4.3.2 jackson-dataformats-text再来看jackson-dataformats-text这是一个可以对YAML、CSV、Properties和XML文件进行操作的库也是目前最常用的不过这里我们只重点关注其对YAML文件的操作添加maven依赖com.fasterxml.jackson.dataformat jackson-dataformat-yaml 2.9.8读 YAML 文件想要读取 YAML 文件最主要的是在new ObjectMapper对象的时候加入new YAMLFactory()这样就成功切换至 yaml 操作的状态然后利用readValue方法就可以完成对yaml文件的数据读取了1)创建 YAML 文件name: allenage: 112)创建ObjectMapper对象设置new YAMLFactory()Testvoid 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.TestFileSourceba2f4ec11在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 map new HashMap(){ { put(name,tester); put(sex,男); } };}2)创建单元测试创建ObjectMapper对象加入new YAMLFactory() 参数调用writerWithDefaultPrettyPrinter().writeValueAsString方法可对指定对象进行yaml数据格式的输出Testvoid prettyPrintYaml() throws JsonProcessingException { ObjectMapper mapper new ObjectMapper(new YAMLFactory()); // pretty print String json mapper.writerWithDefaultPrettyPrinter().writeValueAsString(new TestFileSource()); System.out.println(json);}3)打印结果---name: testerage: 2arr:- - 1 - 2 - 3- - a - b - cmap: sex: 男 name: tester(文章来源于霍格沃兹测试学院)