构建测试知识体系,欢迎关注
“ 自动化中的配置信息,比如域名、数据库信息、kafka信息等,通常是放到配置文件中的。那么如何读取配置文件中的信息呢?”
自动化测试代码中,像请求域名host在不同的测试脚本都会用到,应该放到一个公共的地方来维护,而不是在测试脚本或者测试数据文件中硬编码。这样如果需要对其进行修改,那么只需要修改一个地方就可以了。
除了域名host外,其他与测试环境相关的配置信息,比如数据库信息、kafka连接信息等,以及与测试环境相关的基础测试数据,比如测试账号,都可以放到配置文件中。
很多时候,我们会有不同的测试环境,比如dev环境、test环境、stg环境、prod环境等。在项目的根目录下,创建config文件夹,下面创建子目录来区分不同的测试环境,在子目录中创建config.yaml配置文件。
因此config文件夹,应该是类似这样的结构:
├── config│ ├── stg│ │ └── config.yaml│ └── test│ └── config.yaml
01
—
配置文件放什么信息
在config.yaml中存放不同环境的配置信息,比如域名host、mysql数据信息:
host: douban: http://api.douban.commysql: database1: host: localost port: 3306 user: root password: root database: api_test autocommit: True cursorclass: pymysql.cursors.DictCursor charset: utf8mb4
02
—
读取配置信息
在自动化测试项目tests/目录中创建一个文件conftest.py,定义一个fixture函数env,用来读取配置文件信息:
@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
这时env_config中就包含了config.yaml中的配置信息了。
env函数中有一个参数request,其实request也是一个fixture函数。在这里用到了它的request.config.rootdir属性,这个属性表示的是pytest.ini这个配置文件所在的目录,因为我们的测试项目中pytest.ini处于项目的根目录,所以config_path的完整路径就是:
/Users/chunming.liu/learn/api_pytest/config/test/config.yaml
03
—
脚本中使用配置信息
将env作为参数传入测试函数test_env,将测试函数内的host改为从env读取:
def test_env(self, env): r = requests.request("GET", url=env["host"]["douban"] + "/v2/movie/in_theaters", headers={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"}, params={"apikey": "0df993c66c0c636e29ecbb5344252a4a", "start": 0, "count": 10}) response = r.json()
这样就达到了测试配置文件与测试脚本相互分离的效果,如果需要修改host,只需要修改配置文件即可,测试脚本文件就不用修改了。修改完成后执行测试的方法不变。
04
—
读取不同的配置信息
上面的env函数实现中,有点点小缺憾,就是读取的配置文件是固定的,读取的都是test环境的配置信息,我们希望在执行测试时,通过命令行选项,可指定读取哪个环境的配置,以便在不同的测试环境下开展测试。Pytest提供了一个叫作pytest_addoption的Hook函数,可以接受命令行选项的参数,写法如下:
def pytest_addoption(parser): parser.addoption("--env", action="store", dest="environment", default="test", help="environment: test or prod")
pytest_addoption的含义是,接收命令行选项--env选项的值,存到environment变量中,如果不指定命令行选项,environment变量默认值是test。将上面代码也放入conftest.py中,并修改env函数,将os.path.join中的"test"替换为request.config.getoption("environment"),
@pytest.fixture(scope="session")def env(request): config_path = os.path.join(request.config.rootdir, "config", request.config.getoption("environment"), "config.yaml") with open(config_path) as f: env_config = yaml.load(f.read(), Loader=yaml.SafeLoader) return env_config
这样就可以通过命令行选项来控制读取的配置文件了。比如执行stg环境的测试,可以指定--env stg:
$ py.test --env stg tests/test_env.py
如果不想每次都在命令行上指定--env,还可以将其放入pyest.ini中:
[pytest]addopts = --env stg
注意,命令行上的参数会覆盖pyest.ini里面的参数。
05
—
总结
本文将公共参数放入到配置文件中,通过env这个fixture函数读取配置文件信息,就可以在测试函数中使用配置内容了。再通过pytest_addoption 添加命令行参数指定选取哪个目录下的配置文件。