pytest 对比 unittest:
1、pytest 兼容 unittest,使用unittest写的用例,可以通过pytest去执行
2、pytest写用例更加简单
3、加载用例更加智能:
4、pytest可以对用例做分类管理,执行用例更加的灵活
5、unittest是python中的官方库,兼容性更好,更稳定,pytest在安装的时候,可能会出现和python版本的兼容问题。
6、pytest支持的插件非常丰富,功能扩展性强。
7、pytest用例执行的前置后置处理更加高级
pytest发现用例的规则
注意:类一定要大写T开头!!
跳过用例:@pytest.mark.skip
忽略失败的用例(会执行但不会标记失败):@pytest.mark.xfail(reason = “这里可以加入备注:已知的失败用例”)
给用例打自定义标记:
1、注册标记:在启动文件同级别目录下创建一个 pytest.ini的配置文件
2、在pytest.init 添加一个 pytest的配置块
3、在pytest的配置块下面加一个markers的配置项
4、在markers的配置项中去注册标记
5、给对应的用例打标记:@pytest.mark.注册的标记名称
给类打标记:
# 方式一:直接类上面打标记
@pytest.mark.webtest
# 方式二:通过类属性pytestmark
class TestClass(object):
pytestmark = [pytest.mark.webtest, pytest.mark.slowtest]
运行测试用例:
满足或、与操作,or、 and
pytest.main(["-m battery or white"])
pytest数据驱动
@pytest.mark.parametrize('case',[11,22,33,44,155]) def test_03(case): assert case < 100 ----------------------------------------------------------------------- error_case_data = [ {'mobile': "", "pwd": "python1", "expected": "请输入手机号"}, {'mobile': "1868472055a", "pwd": "python1", "expected": "请输入正确的手机号"}, {'mobile': "18684720553", "pwd": "", "expected": "请输入密码"} ] # 读取excel数据 @pytest.mark.parametrize('case', error_case_data) def test_dome(case): print(case) print('--------------用例执行-------------') assert True
用例前置、后置
统一放到conftest.py文件中,和pytest的启动文件放同一目录下,不需要导入!
# 用例级别的前置后置条件 @pytest.fixture() def case_fixture(): # 前置条件 print("------------用例执行的前置条件--------------------") yield # 后置条件 print("------------用例执行的后置条件--------------------")
# 类级别的前置后置 @pytest.fixture(scope='class') def class_fixture(): # 前置条件 print("-------用例类-----执行的前置条件--------------------") yield # 后置条件 print("-------用例类-----执行的后置条件--------------------")
@pytest.fixture(scope='session', autouse=True) def session_fixture(): # 前置条件 print("-------会话级别-----执行的前置条件--------------------") yield # 后置条件 print("-------会话级别-----执行的后置条件--------------------")
# 模块级别的前置后置: # autouse=True:前后置会自动执行,不需要手动添加到指定的类,或函数上去(一般用于模块或会话级别) @pytest.fixture(scope='module', autouse=True) def module_fixture(): # 前置条件 print("-------模块-----执行的前置条件--------------------") yield # 后置条件 print("-------模块-----执行的后置条件--------------------")
用例使用:
@pytest.fixture() def case_fixture(): # 前置 driver = webdriver.Chrome() expected = 200 yield driver, expected # 后置 driver.quit() # @pytest.mark.usefixtures("case_fixture") 这个使用方法,只限于不需要将前置条件中的数据传给用例的情况下 class TestLogin02: """测试登录""" def test_login_pass(self, case_fixture): """正常登录的用例""" driver, expected = case_fixture driver.get("http://www.baidu.com")