Pytest测试配置管理及读取

发表于:2020-9-07 09:30

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:ruink    来源:网络

  环境相关的配置信息应放置到config文件夹中,比如host,数据库信息,测试账号等。很多时候,我们会有不同的测试环境,如test环境、dev环境、prod环境等。我们可以在config文件夹下面创建子目录来区分不同的测试环境。因此config文件夹,应该是类似这样的结构:
  在config.yaml中存放不同环境的配置信息,以前面《pytest接口测试轻松入门》的天气查询接口测试为例,存放天气查询host应该是这样:
  host:
    api: http://wthrcdn.etouch.cn
  将测试配置信息从脚本中拆分出来,就需要有一种机制将其读取到,才能在测试脚本中使用。Pytest提供了fixture机制,通过它可以在测试执行前执行一些操作,在这里我们利用fixture提前读取到配置信息。
  在之前,安装yaml文件支持,使用pip命令安装:
  pip install pyyaml
  在自动化测试项目testcase/目录中创建一个文件conftest.py,定义一个fixture函数env:
  # 存储参数化数据和函数,模块下的用例执行时,会自动读取conftest.py文件中的数据
  import os
  import pytest
  import yaml
  #加载读取配置文件config.yaml
  @pytest.fixture(scope="session")
  def env(request):
      config_path = os.path.join(request.config.rootdir,
                                 "config",
                                 "test",
                                 "config.yaml")
      with open(config_path) as f:
          env_config = yaml.load(f.read(), Loader=yaml.SafeLoader)
      return env_config
  conftest.py文件是一个plugin文件,里面可以实现Pytest提供的Hook函数或者自定义的fixture函数,这些函数只在conftest.py所在目录及其子目录中生效。scope="session" 表示这个fixture函数的作用域是session级别的,在整个测试活动中开始前执行,并且只会被执行一次。(scope参数可以是session, module,class,function;默认为function。)
  env函数中有一个参数request,其实request也是一个fixture函数。在这里用到了它的request.config.rootdir属性,这个属性表示的是pytest.ini这个配置文件所在的目录,因为我们的测试项目中pytest.ini处于项目的根目录,所以config_path的完整路径就是:
  D:/PYTEST/config/test/config.yaml
  注意:当根目录下没有pytest.ini配置文件时,会默认指向conftest.py所在目录;此时要指向项目根目录,则在项目目录下新建一个 pytest.ini 空文件即可。
  写一个简单的用例 test_simple.py,获取到对应的host并打印出来:
  class TestMine(object):
      def testMyInfo(self,env):
          host = env["host"]["api"]
          print("
  天气api的host地址:"+host)
  pytest执行结果:
  ============================== 1 passed in 0.03s ==============================
  Process finished with exit code 0
  PASSED                              [100%]
  天气api的host地址:http://wthrcdn.etouch.cn
  说明:根据执行结果,成功获取到了配置文件中的天气api的host地址。
  改写前面在《pytest接口测试轻松入门》的接口测试用例:
  @allure.feature("测试Dome")
  class TestSimple(object):
      @allure.story("天气查询")
      @allure.description('一个免费的天气查询接口测试')
      @allure.severity('critical')
      def testWatcher(self,env):
          host = env["host"]["api"]
          url = host + "/weather_mini?city=成都"
          with allure.step("查询天气"):
              r = requests.get(url)
              assert r.status_code == 200
              d = r.json()
              print(d)
              if ('wendu' not in d['data'].keys()):
                  pytest.xfail('返回结果不正确,wendu=NULL')
  执行结果:
  ============================== 1 passed in 0.25s ==============================
  Process finished with exit code 0
  PASSED                           [100%]{'data': {'yesterday': {'date': '6日星期三', 'high': '高温 29℃', 'fx': '无持续风向', 'low': '低温 21℃', 'fl': '<![CDATA[<3级]]>', 'type': '多云'}, 'city': '成都', 'aqi': '32', 'forecast': [{'date': '7日星期四', 'high': '高温 27℃', 'fengli': '<![CDATA[<3级]]>', 'low': '低温 18℃', 'fengxiang': '无持续风向', 'type': '中雨'}, {'date': '8日星期五', 'high': '高温 26℃', 'fengli': '<![CDATA[<3级]]>', 'low': '低温 16℃', 'fengxiang': '无持续风向', 'type': '阴'}, {'date': '9日星期六', 'high': '高温 26℃', 'fengli': '<![CDATA[<3级]]>', 'low': '低温 15℃', 'fengxiang': '无持续风向', 'type': '阴'}, {'date': '10日星期天', 'high': '高温 29℃', 'fengli': '<![CDATA[<3级]]>', 'low': '低温 17℃', 'fengxiang': '无持续风向', 'type': '多云'}, {'date': '11日星期一', 'high': '高温 26℃', 'fengli': '<![CDATA[<3级]]>', 'low': '低温 16℃', 'fengxiang': '无持续风向', 'type': '多云'}], 'ganmao': '各项气象条件适宜,无明显降温过程,发生感冒机率较低。', 'wendu': '22'}, 'status': 1000, 'desc': 'OK'}
  这样就达到了测试配置文件与测试脚本相互分离的效果,如果需要修改host,只需要修改配置文件即可,测试脚本文件就不用修改了。修改完成后执行测试的方法不变。

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号