干货 | 一改测试步骤代码就全写?为什么不试试用 Yaml实现数据驱动?

170 阅读3分钟

理念与同“UI自动化测试框架”中的“测试步骤的数据驱动”相同,接口中的测试步骤的数据驱动就是将接口的参数(比如 method、url、param等)封装到 yaml 文件中管理。当测试步骤发生改变,只需要修改 yaml 文件中的配置即可。 数据驱动就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。简单来说,就是参数化的应用。数据量小的测试用例可以使用代码的参数化来实现数据驱动,数据量大的情况下建议使用一种结构化的文件(例如yaml,json等)来对数据进行存储,然后在测试用例中读取这些数据。

原理与前面章节“UI自动化测试框架”中的“测试数据的数据驱动”大同小异。依然使用 @pytest.mark.parametrize 装饰器来进行参数化,使用参数化来实现数据驱动。 通过参数化的方式,分别判断id为2,3的部门的parentid为1:

import pytest

class TestDepartment:
    department = Department()
    
        @pytest.mark.parametrize("id", [2, 3])
            def test_department_list(self, id):
                    r = self.department.list(id)
                            assert self.department.jsonpath(expr="$..parentid")[0] == 1
                            
                            ```
                            
                            
                            上面的代码首先使用 @pytest.mark.parametrize 装饰器,传递了两组数据,测试结果显示有两条测试用例被执行,而不是一条测试用例。也就是 pytest 会将两组测试数据自动生成两个对应的测试用例并执行,生成两条测试结果。
                            
                            当测试数据量大的情况下,可以考虑把数据存储在结构化的文件中。从文件中读取出代码中所需要格式的数据,传递到测试用例中执行。本次实战以YAML进行演示。YAML以使用动态字段进行结构化,它以数据为中心,比 excel、csv、Json、XML 等更适合做数据驱动。
                            
                            将上面参数化的两组数据存储到 yaml 文件中,创建一个data/department_list.yml文件,代码如下:
                            
                            ```
                            -2
                            -3
                            
                            ```
                            
                            
                            上面的代码定义了一个 yaml 格式的数据文件department_list.yml,文件中定义了一个列表,列表中有两个数据,最后生成的是这样的数据格式:[1,2]。将测试用例中参数化的数据改造成从 department_list.yml 文件中读取,代码如下:
                            
                            ```
                            class TestDepartment:
                                department = Department()
                                
                                    @pytest.mark.parametrize("id", \
                                        yaml.safe_load(open("../data/department_list.yml")))
                                            def test_department_list(self, id):
                                                    r = self.department.list(id)
                                                            assert self.department.jsonpath(expr="$..parentid")[0] == 1
                                                            
                                                            ```
                                                            
                                                            
                                                            上面的代码,只需要使用yaml.safe_load()方法,读取department_list.yml文件中的数据,分别传入到用例 test_department_list() 方法中完成输入与结果的验证。
                                                            ## 
                                                            实际工作中,对于环境的切换和配置,为了便于维护,通常不会使用硬编码的形式完成。在“多环境下的接口测试”章节中已经介绍了,如何将环境的切换作为一个可配置的选项。本章节会把这部分内容进行重构,使用数据驱动的方式完成多环境的配置。
                                                            
                                                            
                                                            根据“多环境下的接口测试”章节,将此章节中的环境配置部分改为数据驱动的模式
                                                            代码如下:
                                                            
                                                            ```
                                                            #把host修改为ip,并附加host header
                                                            env={
                                                                "docker.testing-studio.com": {
                                                                        "dev": "127.0.0.1",
                                                                                "test": "1.1.1.2"
                                                                                    },
                                                                                        "default": "dev"
                                                                                        }
                                                                                        data["url"]=str(data["url"]).replace(
                                                                                            "docker.testing-studio.com",
                                                                                                env["docker.testing-studio.com"][env["default"]]
                                                                                                )
                                                                                                data["headers"]["Host"]="docker.testing-studio.com"
                                                                                                
                                                                                                ```
                                                                                                
                                                                                                
                                                                                                ## 
                                                                                                依然以yaml为示例,将所有的环境配置信息放到 env.yml 文件中。如果怕出错,可以先使用yaml.safe_dump(env)将dict格式的代码转换为yaml。
                                                                                                如下所示,打印出来的,就是成功转换yaml格式的配置信息:
                                                                                                
                                                                                                ```
                                                                                                def test_send(self):
                                                                                                    env={
                                                                                                            "docker.testing-studio.com": {
                                                                                                                        "dev": "127.0.0.1",
                                                                                                                                    "test": "1.1.1.2"
                                                                                                                                            },
                                                                                                                                                    "default": "dev"
                                                                                                                                                        }
                                                                                                                                                            yaml2 = yaml.safe_dump(env)
                                                                                                                                                                print("")
                                                                                                                                                                    print(yaml2)
                                                                                                                                                                    
                                                                                                                                                                    ```
                                                                                                                                                                    
                                                                                                                                                                    
                                                                                                                                                                    将打印出来的内容粘贴到 env.yml 文件中: env.yml
                                                                                                                                                                    
                                                                                                                                                                    ```
                                                                                                                                                                    docker.testing-studio.com:
                                                                                                                                                                      dev: "127.0.0.1"
                                                                                                                                                                        test: "1.1.1.2"
                                                                                                                                                                          level: 4
                                                                                                                                                                          default:
                                                                                                                                                                            "dev"
                                                                                                                                                                            
                                                                                                                                                                            ```
                                                                                                                                                                            
                                                                                                                                                                            
                                                                                                                                                                            
                                                                                                                                                                            将环境准备中的代码稍作修改,把env变量从一个典型dict改为,使用yaml.safe_load读取 env.yml:
                                                                                                                                                                            
                                                                                                                                                                            ```
                                                                                                                                                                            # 把host修改为ip,并附加host header
                                                                                                                                                                            env = yaml.safe_load(open("./env.yml"))
                                                                                                                                                                            data["url"] = str(data["url"]).\
                                                                                                                                                                                replace("docker.testing-studio.com",
                                                                                                                                                                                    env["docker.testing-studio.com"][env["default"]])
                                                                                                                                                                                    data["headers"]["Host"] = "docker.testing-studio.com"
                                                                                                                                                                                    
                                                                                                                                                                                    ```
                                                                                                                                                                                    
                                                                                                                                                                                    
                                                                                                                                                                                    如此一来,就可以实现使用数据驱动的方式,通过修改 env.yml 文件来直接修改配置信息。
                                                                                                                                                                                    
                                                                                                                                                                                    ## 
                                                                                                                                                                                    内容全面升级,4 个月 20+ 项目实战强化训练,资深测试架构师、开源项目作者亲授 BAT 大厂前沿最佳实践,带你一站式掌握测试开发必备核心技能(对标阿里P6+,年薪50W+)!直推 BAT 名企测试经理,普遍涨薪 50%+!
                                                                                                                                                                                    
                                                                                                                                                                                    ⬇️ 点击“阅读原文”,提升测试核心竞争力!
                                                                                                                                                                                    [原文链接](https://mp.weixin.qq.com/s?__biz=MzU3NDM4ODEzMg==&mid=2247493721&idx=1&sn=5cb2d0236f43a0dbe2677cf4554e6a30&chksm=fd318a92ca46038420b59425eef03f34e762e461ff4fc4ff1eb9f3ee63327f36e1f53dc66b1d#rd) 
                                                                                                                                                                                    
                                                                                                                                                                                    > 获取更多技术文章分享和免费资料领取点击链接:`https://qrcode.testing-studio.com/f?from=juejin&unid={times}&url=https://ceshiren.com/t/topic/16586
                                                                                                                                                                                    [获取更多技术文章分享和免费资料领取点击链接](https://qrcode.testing-studio.com/f?from=juejin&unid=1647844190&url=https://ceshiren.com/t/topic/16586)