pytest ---- 用例执行

 

 

mark中的xfail(失败)

 

 

pytest.xfail()
我们已经掌握了如果跳过执行测试用例,其中有一种方法是在测试函数中用pytest.skip()方法。我们现在要学的pytest.xfail()和pytest.skip()有些相似,只不过他的含义是:将该用例标记成xfail失败,并且该用例中的后续代码不会执行

我们在测试用例中调用pytes.xfail()方法,可以选择传入reason参数表示原因。

import allure
import pytest
import os

class TestClass:
    def test_one(self):
        x = "this"
        assert 'h' in x

    def test_two(self):
        x = "hello"
        print(x)
        pytest.xfail(reason='该功能尚未完成')
        assert hasattr(x, 'check')

    def test_three(self):
        a = "hello"
        b = "hello world"
        assert a in b

if __name__ == "__main__":
    pytest.main(['-s', "--alluredir=./reports/allure"])
# 使用os模块等待allure测试报告生成后,进行进化测试报告
    os.system("allure generate./reports/allure -o ./reports/html --clean")

  

运行结果如下图:我们可以看到该用例中pytest.xfail()方法之前的代码运行了,之后的不再运行;结果中有一天用例被标记为xfail。

============================= test session starts =============================
platform win32 -- Python 3.9.0, pytest-6.2.3, py-1.10.0, pluggy-0.13.1
rootdir: D:\
plugins: allure-pytest-2.8.40, html-3.1.1, metadata-1.11.0
collected 3 items

..\..\..\..\pycharm_projects\pytest_study\scripts\test_feature.py .hello
x
测试已忽略..

======================== 2 passed, 1 xfailed in 0.20s =========================

 

这个方法是我们直接将用例标记为失败,那什么情况我们会这么做呢?功能未完成、已知有问题。除此之外,就是用例的执行需要前置条件或操作,如果前置条件或操作失败,那么我们就可以直接将该用例设为失败,也就是xfail。

 

@pytest.mark.xfail
除了上面学习的pytest.xfail(),xfai还有一种使用方法。就是@pytest.mark.xfail标签,他的含义是期望测试用例是失败的,但是不会影响测试用例的的执行。如果测试用例执行失败的则结果是xfail(不会额外显示出错误信息);如果测试用例执行成功的则结果是xpass

import allure
import pytest
import os

class TestClass:
    def test_one(self):
        x = "this"
        assert 'h' in x
    @pytest.mark.xfail
    def test_two(self):
        x = "hello"
        print(x)
        assert hasattr(x, 'check')

    def test_three(self):
        a = "hello"
        b = "hello world"
        assert a in b

if __name__ == "__main__":
    pytest.main(['-s', "--alluredir=./reports/allure"])
# 使用os模块等待allure测试报告生成后,进行进化测试报告
    os.system("allure generate./reports/allure -o ./reports/html --clean")

文件名类名方法执行部分用例

 

 

-v 指定的函数节点id
如果想指定运行某个.py模块下,类里面的一个用例,如:TestClass里面testmethod用例
每个test开头(或_test结尾)的用例,函数(或方法)的名称就是用例的节点id,指定节点id运行用-v 参数

pytest -v test_server.py::TestClass::test_method

选择运行整个class

 pytest -v test_server.py::TestClass

选择多个节点运行,多个节点中间空格隔开

pytest -v test_server.py::TestClass test_server.py::test_send_http

  

-k 组合调用执行部分用例

 

 -k 匹配用例名称
可以使用-k命令行选项指定在匹配用例名称的表达式

pytest -v -k http

  

运行所有的测试,根据用例名称排除掉某些用例:

pytest -k “not send_http” -v

  

同时选择匹配 “http” 和“quick”

pytest -k “http or quick” -v

  

  

使用自定义标记mark只执行部分用例

 

 mark标记
以下用例,标记test_send_http()为webtest

import pytest

@pytest.mark.webtest
def  test_send_http():
    print("test_send_http")
    assert 0


def test_something_quick():
    print("test_something_quick")
    pass
def  test_another():
    print("test_another")
    pass
class TestClass:
    def test_method(self):
        print("test_method")
        pass

if __name__ == "__main__":
   # pytest.main(['-s',"test_three.py","-m=webtest"])
    pytest.main() 

 

执行cmd命令:

pytest -v -m "webtest"   
pytest -v -m "not webtest"

  

 

 

posted on 2021-04-14 14:43  清明-心若淡定  阅读(245)  评论(0编辑  收藏  举报