自动化脚本如何切换环境?Pytest这些功能你必须要掌握

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 自动化脚本如何切换环境?Pytest这些功能你必须要掌握,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

在这里插入图片描述


一、前言

测试工程师每天都跟不同的环境打交道,比如线上环境,测试环境,预上线环境等等,那么作为自动化测试人员写的代码,我们也要具备能自由切换环境的能力,如何能让我们python语言写的测试用例可以自由切换到不同的环境下面去运行呢?

二、安装

pytest有一个插件叫pytest-base-url ,是管理base_url非常好的一款插件

pip install pytest-base-url

三、使用

第1种:使用方式是终端添加–base-url这个命令

pytest --base-url http://www.baidu.com works
#encoding=utf-8
import time
import requests
import pytest

name = "登录"
@pytest.fixture(scope="class")
def class_setup_teardown():
    print(f"\n============= {name} 接口测试开始! ==============")
    yield
    print(f"\n============= {name} 接口测试结束! ==============")


@pytest.mark.usefixtures("class_setup_teardown")
class TestWork:

    def test_work1(self,base_url):
        resp=requests.get(base_url)
        print(base_url)
        resp_code=resp.status_code
        assert resp_code==200

if __name__ == '__main__':
    pytest.main()

执行结果:
在这里插入图片描述

第2种:使用方式是在pytest.ini配置文件种去配置base_url,然后自动读取url的数据,这样就不用添加–base-url这个命令行参数了:

在这里插入图片描述

#encoding=utf-8
import time
import requests
import pytest

name = "登录"
@pytest.fixture(scope="class")
def class_setup_teardown():
    print(f"\n============= {name} 接口测试开始! ==============")
    yield
    print(f"\n============= {name} 接口测试结束! ==============")


@pytest.mark.usefixtures("class_setup_teardown")
class TestWork:

    def test_work1(self,base_url):
        resp=requests.get(base_url)
        print(base_url)
        resp_code=resp.status_code
        assert resp_code==200


if __name__ == '__main__':
    pytest.main()

运行命令:

pytest works

第3种:pytest有个hooks函数,可以自定义命令行参数,一般在conftest.py中去引用。

conftest.py中写pytest_addoption这个hooks函数,可以自定义命令行参数,base_url只能对一个url地址进行传递,那么有的项目不仅需要多项目请求的url地址进行不同环境的切换,还需要对mysql的url地址进行不同的切换,这个时候就可以用自定义命令,定义不同的命令行参数,这样我们在执行pytest的时候就可以自由进行传递。

conftest.py

import pytest
@pytest.fixture(scope='session',autouse=True)
def my1_fixture():
    print('----这是前置方法----')
    yield
    print('----这是后置方法----')



def pytest_addoption(parser):
    parser.addoption( "--test-url",
                      action="store",
                      default="http://www.baidu.com",
                      help="传递项目url"
    )

    parser.addoption("--produce-url",
                     action="store",
                     default="http://www.sogou.com",
                     help="传递数据库主机名称"
                     )

    parser.addoption("--develop-url",
                     action="store",
                     default="https://www.tencent.com/",
                     help="传递数据库主机名称"
                     )

# 获取 pytest.ini 配置参数
@pytest.fixture(scope="session")
def get_url(request):
    test_url = request.config.getoption('--test-url')
    produce_url = request.config.getoption('--produce-url')
    develop_url = request.config.getoption('--develop-url')
    print("\n读取到配置文件的测试url地址:%s" % test_url)
    print("\n读取到配置文件的生产url地址:%s" % produce_url)
    print("\n读取到配置文件的开发url地址:%s" % develop_url)
    return test_url,produce_url,develop_url

test_work.py

#encoding=utf-8
import time
import requests
import pytest

name = "登录"
@pytest.fixture(scope="class")
def class_setup_teardown():
    print(f"\n============= {name} 接口测试开始! ==============")
    yield
    print(f"\n============= {name} 接口测试结束! ==============")


@pytest.mark.usefixtures("class_setup_teardown")
class TestWork:

    def test_work1(self,get_url):
        resp=requests.get(get_url[0])
        print(get_url[1])
        resp_code=resp.status_code
        assert resp_code==200


if __name__ == '__main__':
    pytest.main()

在这里插入图片描述

第4种:通过yml文件和fixture进行配合使用

如果需要改环境,直接在con.yml中改参数即可(develop\test\produce)

在这里插入图片描述

conftest.py

import pytest
import yaml


@pytest.fixture(scope='session',autouse=True)
def my1_fixture():
    print('----这是前置方法----')
    yield
    print('----这是后置方法----')

@pytest.fixture(scope="session")
def config():
    with open(r'D:\project_development\api_pytest\conf.yml',"r",encoding="utf-8") as f:
        conf=yaml.load(f,Loader=yaml.FullLoader)
        return conf

@pytest.fixture(scope="session")
def env_vars(config):
    env=config["env"]
    mapping={
        "test":{
            "base_url":"http://www.baidu.com",
            "mysql_url":"127.0.0.1",
        },
        "develop": {
            "base_url": "http://www.sogou.com",
            "mysql_url": "127.0.0.2",
        },
        "produce": {
            "base_url": "http://www.tencent.com",
            "mysql_url": "127.0.0.3",
        },
    }
    base_url=mapping[env]['base_url']
    mysql_url=mapping[env]['mysql_url']
    return base_url,mysql_url


test_work.py

#encoding=utf-8
import time
import requests
import pytest

name = "登录"
@pytest.fixture(scope="class")
def class_setup_teardown():
    print(f"\n============= {name} 接口测试开始! ==============")
    yield
    print(f"\n============= {name} 接口测试结束! ==============")


@pytest.mark.usefixtures("class_setup_teardown")
class TestWork:

    def test_work1(self,env_vars):
        resp=requests.get(env_vars[0])
        print(env_vars[0])
        print(env_vars[1])
        resp_code=resp.status_code
        assert resp_code==200


if __name__ == '__main__':
    pytest.main()


在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123160.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!