1、概述

pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点:

  • 1、简单灵活,容易上手,文档丰富;
  • 2、支持参数化,可以细粒度地控制要测试的测试用例;
  • 3、能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests);
  • 4、pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等;
  • 5、测试用例的skip和xfail处理;
  • 6、可以很好的和CI工具结合,例如jenkins

2、安装pytest

与安装其他的python软件无异,直接使用pip安装。

pip install -U pytest

安装完成后,可以验证安装的版本:

pytest --version

3、cmd执行(命令行执行)

1)pytest   

会查找当前目录及其子目录下以  test_*.py  或 *_test.py 文件,找到文件后,在文件中找到以  test 开头函数并执行

1)pytest   somepath

会查找somepath目录下以  test_*.py  或 *_test.py 文件,找到文件后,在文件中找到以  test 开头函数并执行

2)pytest **.py   

执行该文件中test开头的函数并执行

3)pytest **.py::test_func

执行指定测试文件下的测试函数

3)pytest   **.py::classname::test_functionname

执行某个文件下某个类的某个方法

4、pycharm执行(代码行执行)

1)perferences ---->Tools  -----> Python Integrated Tools ---->Default test runner设置为pytest 。之后直接执行测试用例即可

2)if __name__ =="__main__":

            command_line = ["-s","./test_creative_create_card_pic_nobase.py","--alluredir=../result"]

           pytest.main(command_line)

5、pytest参数

1、-K EXPRESSION

执行某个关键字的用例
用例要匹配给出的表达式;使用python的语法,匹配的范围是文件名、类名、函数名为变量,用and来区分

如下面一段测试用例(文件实现方式)

# content of test.py
def test_two():
    x = "hello"
    assert hasattr(x, 'check')


def test_a():
    assert 1 == 2

运行pytest时带-k参数

# 执行当前文件名称中包含test_a字符的测试用例
pytest -k "test_a"  test.py

# 执行当前文件名称中不包含test_a字符的测试用例
pytest -k "not test_a"  test.py

# 执行当前文件名称中包含 test_a 字符或 test_two 字符的测试用例
pytest -k "test_a or test_two"  test.py

如下面一段测试用例(类实现方式)

# content of test.py
class TestClass(object):
     def test_zne(self):
         x = "this"
         assert 'h' in x
 
     
     def test_two(self):
         x = "hello"
         assert hasattr(x, 'check')
         
     def test_a(self):
         assert 1==2

运行pytest时带-k参数

# 测试类名包含 TestClass,并且该测试类中包含 test_a 将被跳过

pytest -k "test and TestClass and not test_a"  test.py
或者
pytest -k "TestClass and not test_a"  test.py
# 测试类或函数包含 test_a 或 test_two 中的测试将被运行
pytest -k "test_a or test_two"

如下面一段测试用例(类实现方式)

2、-x

遇到执行失败的用例或错误,停止测试

3、--maxfail=num

当错误个数到达给定个数,退出测试,这里就不列举实例了,结果与-x类似

4、-m MARKEXPR

  只能运行有相应标识的测试用例,使用这个参数,测试用例要使用@pytest.mark.marker修饰

  如下实例

# content of test.py
class TestClass(object):
    def test_zne(self):
        x = "this"
        assert 'h' in x

    @pytest.mark.b
    def test_two(self):
        x = "hello"
        assert hasattr(x, 'check')

    @pytest.mark.a
    def test_a(self):
        assert 1 == 2

teste_two使用了@pytest.mark.b来修饰,teste_a使用了@pytest.mark.a来修饰。

# 只执行a标识的用例
pytest –m a test.py

# 如果要运行多个标识的话,用表达式,如下
注意,-m后面不能带''号(单引号),只能带""(双引号),不然识别不到
pytest -m "a or b"        # 运行有 a 标识或 b 标识用例
pytest -m "a and not b"   # 运行有 a 和没有 b 标识的用例

5、 -v, --verbose

详细结果

6、-q, --quiet

 极简结果显示,简化控制台的输出,可以看出输出信息和之前不添加-q不信息不一样, 下图中有两个..点代替了pass结果

7、-s

输入我们用例中的调式信息,比如print的打印信息等,我们在用例中加上一句 print(driver.title),我们再运行一下我们的用例看看,调试信息输出

8、-V

可以输出用例更加详细的执行信息,比如用例所在的文件及用例名称等

9、--junit-xml=path

输出xml文件格式,在与jenkins做集成时使用

10、 --result-log=path

将最后的结果保存到本地文件中