https://www.kdocs.cn/l/cm5SOndujMBM?from=docs&t=1640247666947&newFile=true
- 测试工具选型
pytest: 是python的第三方单元测试框架,比自带unittest更简洁和高效,支持315种以上的插件,同时兼容unittest 框架。 allure:是一款轻量级并且非常灵活的开源测试报告框架。 它支持绝大多数测试框架, 例如TestNG、Pytest、JUint等。 - 测试工具文档
pytest官方文档:https://learning-pytest.readthedocs.io/zh/latest/ allure官方文档:https://docs.qameta.io/allure/ - 插件功能SDK
https://p.wpseco.cn/wiki/doc/618261c833fe54743f23765e - 项目第三方包的安装
pytest requests pytest-xdist 测试用例分布式执行 pytest-ordering 用于改变测试用例的执行顺序 pytest-rerunfailures 用例失败重跑 pytest-html 生成html自动化报告 allure-pytest 生成美观的自动化报告 - 项目目录分层
Common:存放个模块的共用方法 conf:存放项目的配置信息 outputs:存在测试日志和报告的位置 testcase:存放测试用例的位置 testdatas:存放测试数据的位置 - 重写日志模块
重新日志模块继承logging,输出控制台和日志文件, 日志输出到控制台 handle1 = logging.StreamHandler() handle1.setFormatter(formatter) self.addHandler(handle1) 日志输出日志文件 if file:文件渠道 handle2 = logging.FileHandler(file,encoding=“utf-8”) handle2.setFormatter(formatter) self.addHandler(handle2) 设置日志输出的级别和位置 [log] name = sdk level = INFO file_ok = True file_name = sdk.log - 编写接口关键字
def del_dept(companyId,dept_ids,header,is_verify=True): url = base_url + “/plussvr/api/v1/companies/”+str(companyId)+"/department" data = {“dept_ids”:dept_ids,“csrfmiddlewaretoken”:csrf} res = send_request(“delete”,url, json=data, headers=header,verify=False) allure.attach(join_params(url, data,header=header, response=res.text), “删除部门接口详情”, allure.attachment_type.TEXT) if is_verify is True: assert res.status_code == 200 return res - 调用接口关键字编写自动化测试用例
@pytest.mark.wpsplus @allure.title(“获取部门成员”) def test_getdeptusers01(self,group_fixture): allure.dynamic.description(“获取部门成员,comp_id不为空”) comp_id = group_fixture[1] user_id = group_fixture[2] with allure.step(“新建部门”): resp = get_user_permission(comp_id,user_id,loginHeadersWithCsrf) rootDeptId = resp.json()[“dept_ids”][0] deptName = String().generate_random_string() resp1 = create_department(comp_id,deptName,rootDeptId,loginHeadersWithCsrf) with allure.step(“部门下面新建成员”): deptId = resp1.json()[“info”][“id”] userName = String().generate_random_string() comp_uid_resp = createUser(comp_id,userName,userName,deptId,superPasswd,3,loginHeadersWithCsrf) comp_uid = [] comp_uid.append(comp_uid_resp.json()[“comp_uid”]) with allure.step(“获取部门下面的成员”): status = “active&status=notactive&status=disabled” resp2 = getdeptusers(comp_id,deptId,status,loginHeadersWithCsrf) assert resp2.json()[“data”][“total”] == 1 assert resp2.json()[“data”][“users”][0][“account”] == userName assert resp2.json()[“data”][“users”][0][“name”] == userName assert resp2.json()[“data”][“users”][0][“role_id”] == 3 assert resp2.json()[“data”][“users”][0][“status”] == “notactive” with allure.step(“删除用户和部门”): self.teardown_function(comp_id,comp_uid,deptId,loginHeadersWithCsrf) - 用例的setup和teardown
- setup和teardown的使用
setup_class 在类前执行 teardown_class在类之后执行 setup 在每个用例之前执行 teardown 在每个用例之后执行 2.fixture夹具的使用 夹具一般都放在conftest.py,名称是不能更改 通过yield分开用例前置条件和后置条件,yield也将调用该fixture的值返回 socpe的取值 function:每个test用例都运行,默认是function的scope class:每个class的所有test只运行一次 module:每个module的所有test只运行一次 session:每个会话运行一次
@pytest.fixture(scope=“function”,autouse=True) def my_fixture(): print(“这是前置条件”) yield print(“这是后置条件”)
注:把一个函数定义为Fixture很简单,只能在函数声明之前加上“@pytest.fixture”。其他函数要来调用这个Fixture,只用把它当做一个输入的参数即可。 10. 给用例添加tag @pytest.mark.smoke @pytest.mark.user 通过tag选择用例进行执行测试 -m “smoke” 执行有smoke的用例 -m “smoke and user” 执行有smoke和user的用例 -m “smoke or user” 执行有smoke或者user的用例 11. 断言 assert xx :判断 xx 为真; assert not xx :判断 xx 不为真; assert a in b :判断 b 包含 a; assert a == b :判断 a 等于 b; assert a != b :判断 a 不等于 b; 12. 配置文件pytest.ini 配置pytest.ini文件,需要是 ANSI编码 [pytest] addopts= addopts= -vs -m “debug” --reruns 3 -s --alluredir ./Outputs/temp --clean-alluredir -p no:warnings #命令行的参数,用空格分隔 testpaths = ./testcase #测试用例的路径 python_files = test_.py #模块名的规则 python_classes = Test #类名的规则 python_functions = test #方法名的规则 marker = smoke:冒烟测试 注: -s :表示输出调试信息,包括print打印信息 -v:显示更详细的信息 -n :支持多线程或者分布式运行测试用例 如:pytest -vs ./testcase/test_login.py -n 2 表示2个线程 –rerune NUM:失败用例重跑 NUM指失败次数
改变测试用例的执行顺序
@pytest.mark.run(order=3)
- allure配置
pip install allure-pytest https://github.com/allure-framework/allure2/releases 下载后解压,把bin目录添加至path环境变量 allure --version 需要有java环境 生成报告 -vs --alluredir ./Outputs/temp --clean-alluredir 构建测试报告 新建run.py #注意需要在命令行运行run.py才会生成报告 if name == ‘main’: pytest.main() time.sleep(2) os.system(“allure generate ./Outputs/temp -o ./Outputs/reports --clean”)
注:如果乱码需要将pycharm也加入path环境变量里面 @allure.title(“标题1”) def test02(self,my_fixture): allure.dynamic.description(‘描述’) with allure.step(“测试步骤”): 14. 测试报告的分析
|