说明

上次介绍了下如何使用pycharm来运行pytest测试用例,这次来说一说pytest用例运行的规则,俗话说无规则不成方圆,那pytest用例也有自己的一套规则,只有按照这套规则,我们写的测试用例才能被pytest正确识别出来,才能判断哪些用例是需要执行的,哪些用例是不需要执行的。

pytest执行用例结果 pytest运行指定用例_用例

用例设计原则

设计原则:
pytest 运行的规则是查找当前目录及其子目录下以 test_.py 或_test.py 文件,找到文件后,在文件中找到以 test 开头函数并执行,如下所示:

#-*- coding:utf-8 -*-

#test_class.py

'''
pytest会自动识别test_one、test_two两个函数,并自动运行。
'''

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

    def test_two(self):
        x = 'hello'
        #assert hasattr(x,'check')
        assert 'h' in x

运行结果如图所示:

pytest执行用例结果 pytest运行指定用例_pytest执行用例结果_02

所以我们在编写pytest测试用例时要符合以下几点:

1、文件名以 test_.py 或者test.py
2、编写的函数名称以 test_开头
3、编写的测试类要以Test格式命名
4、方法要以test
*开头

5、所有的包package必须要有__init__.py文件

明确了以上规则之后,我们来通过代码来实际运行看一下效果。

pytest执行用例结果 pytest运行指定用例_自动化测试_03


代码演示

1、我们先演示下以test_*开头的函数,首先新建一个test_sample.py的文件,代码和运行结果如下:

import pytest
def test_one():
    x = 'this'
    assert 'h' in x
    print('执行了test_one')

def test_two():
    x = 'hello'
    #assert hasattr(x,'check')
    assert 'h' in x
    print('执行了test_two')

def tet_three():
    assert 5 ==5
    print('执行了tet_three')

if __name__ == '__main__':
    pytest.main(['-s','test_sample.py'])

pytest执行用例结果 pytest运行指定用例_python_04


可以看到以上结果只自动识别并运行了test_one、test_two,而tet_three并没有被识别到,这是因为tet_three格式不是标准的test_*格式,它并没有被pytest自动识别出来从而没有自动运行,接下来将其修改成test_three后可正确被识别运行。

import pytest

def test_one():
    x = 'this'
    assert 'h' in x
    print('执行了test_one')

def test_two():
    x = 'hello'
    #assert hasattr(x,'check')
    assert 'h' in x
    print('执行了test_two')

def test_three():
    assert 5 ==5
    print('执行了tet_three')

if __name__ == '__main__':
    pytest.main(['-s','test_sample.py'])

pytest执行用例结果 pytest运行指定用例_python_05


2、接下来我们再演示一个以 Test 开头的类的运行用例首先新建一个test_class.py的文件,代码如下:

import pytest
'''
编写一个TestCLass类
'''
class TestClass():
    def test_one(self):
        x = 'this'
        assert 'h' in x
        print('执行了test_one')

    def test_two(self):
        x = 'hello'
        #assert hasattr(x,'check')
        assert 'h' in x
        print('执行了test_two')

    def test_three(self):
        assert 5 ==5
        print('执行了tet_three')
if __name__ == '__main__':
    pytest.main(['-s','test_class.py'])

从运行结果可以看出,pytest自动识别出了TestClass类,并运行了test_one,test_two,test_three三个函数。

pytest执行用例结果 pytest运行指定用例_python_06


接下来,将TestCLass修改成TetClass,其他函数都保持不变,这次运行结果可以看出没有任何函数方法被执行,这就是因为pytest没有识别出TetClass,继而其下面的函数格式即使正确了,也没有被运行。

pytest执行用例结果 pytest运行指定用例_python_07

总结

因此我们在日常写测试用例时要严格按照pytest运行的格式,相反地当我们写的测试用例没有运行时,也需要考虑是不是写的函数类、方法命名错误来进行排查。

pytest执行用例结果 pytest运行指定用例_pytest_08