一、命令行指定目录

指定目录时,只执行指定目录的用例,目录命名没有具体要求

文件目录结构如下:

tests
  |--------demo01
             |--------__init__.py
             |--------test_demo01.py
  |--------demo02
             |--------__init__.py
             |--------test_demo02.py

test_demo01.py文件内容:

def test_func1():
    print("in test_func1......")
    assert 1==1

test_demo02.py文件内容

def test_func2():
    print("in test_func2......")
    assert 1==1

如下,在tests目录下指定demo01目录,只会执行demo01目录下的测试用例
WX20220512-140904.png

二、命令行不指定目录

命令行不指定目录时,会查找当前目录下的测试用例以及递归的查找当前目录下得文件夹

目录结构如下

tests
  |--------test_demo.py
  |--------demo01
             |--------__init__.py
             |--------test_demo01.py
             |--------demo01_01
                          |--------__init__.py
                          |--------test_demo01_01.py
  |--------demo02
             |--------__init__.py
             |--------test_demo02.py

test_demo.py,test_demo01.py,test_demo02.py,test_demo01_01.py内容如下:
WX20220512-141204.png

三、测试脚本文件名默认规则

测试脚本文件名规则要求test_.py 或者 _test.py格式的

目录结构如下:

demo01
  |--------__init__.py
  |--------test_demo01.py
  |--------demo02.py
  |--------demo03_test.py
  |--------demo04test.py
  |--------testdemo05.py

其中上述除__init__.py文件以外,其他文件的内容均为如下:

def test_func():
    print("in test_func...")
    assert 1==1

使用pytest -s 执行结果如下,可以发现这里只执行了test_demo01.py和demo03_test.py 两个文件中的测试脚本,其他文件中的测试脚本并没有执行,原因就是文件的命名不符合pytest默认的文件命名规则
WX20220512-141546.png

四、不同目录下测试文件命名是否可以相同

当每个目录下都有__init__.py文件的时候,不同目录下的测试文件命名是完全可以相同的,这也是推荐的做法,但是当目录中没有__init__.py文件的时候,就需要注意了,如果出现文件重名的,可能会出现问题了,先来看下下面的结果

目录结构如下:

demo01
  |--------demo02
             |--------__init__.py
             |--------test_demo01.py
  |--------test_demo01.py

在demo01的目录下执行pytest -s ,结果如下,可以看出,这里两个文件名相同的,因为demo02文件夹中有__init__.py文件,所有此时是可以执行的
WX20220512-141822.png
此时将demo02目录中的__init__.py文件删除,然后再执行 pytest -s,结果如下,可以看出此时报错了
WX20220512-141923.png
这里是跟pytest加载用例的原理有关,pytest在加载用例的时候实质是把测试用例文件当做模块导入的,而在导入模块之前,pytest首先是把一个basedir的变量添加到环境变量中,basedir的计算原理是针对每个测试脚本,向上递归的查找,找到最顶层带有__init__.py文件的目录,然后这个目录的上层目录作为basedir添加到环境变量中,然后根据basedir计算每个测试脚本文件的相对路径,这么说比较枯燥,以下面的目录结构为例:

针对第一个test_demo01.py文件,从当前目录开上往上找,找到最后一层带有__init__.py文件的目录,这里是demo04,此时pytest会把demo04的上一层目录demo03添加到环境变量中,然后从demo03开始确定第一个test_demo01.py的导入的相对路径,即demo04.test_demo01.py

针对第二个test_demo01.py文件,同样从当前目录开始往上找,找到最后一层带有__init__.py文件的目录,这里也是demo04,此时pytest会把这个目录的上一层目录demo02添加到环境变量中,然后从demo02开始计算第二个test_demo01.py的导入的相对路径,即demo04.test_demo01.py

即此时发现这两个相同名字的文件虽然在不同层次不同文件夹中,但是经过pytest计算发现他们两个的导入路径完全相同,因此此时就会报错

demo02
  |--------demo03
             |--------demo04
                        |--------__init__.py
                        |--------test_demo01.py
  |--------demo04
             |--------__init__.py
             |--------test_demo01.py

在demo02目录下执行 pytest -s 命令得到如下结果,与上述分析结果一致,即报错了
WX20220512-143234.png

因此当目录中不带有__init__.py文件的时候,如果再使用相同文件名的测试脚本,则是有可能会报错的,具体会不会报错就需要根据上面的导入模块原理去分析

因此为了免去分析以及引起不必要的麻烦,这里强烈推荐创建脚本的时候每个目录都存放一个__init__.py文件,这样是无论如何也不会出现两个相同的相对导入路径的,这个也是为什么在有一些文章或教程中直接宣称创建pytest用例的时候必须要带__init__.py文件的原因

更多关于模块导入的内容,请参考 Pytest(二十五)测试脚本的加载原理

五、测试脚本中测试函数命名规则

测试脚本中测试函数命名以test开头的函数即作为测试函数

test_demo01.py内容如下:

def test_func():
    print("in test_func...")
    assert 1==1

def testfunc():
    print("in testfunc...")
    assert 1==1

def func_test():
    print("in func_test...")
    assert 1==1

def Test_func():
    print("in Test_func...")
    assert 1==1

使用pytest -s 执行结果如下,可以发现这里test_func和testfun均作为测试函数被执行
WX20220512-143347.png

六、测试脚本中测试类命名规则

测试类命名要求以Test开头,并且测试类中不能有__init__函数,测试类中的方法同样要求以test开头
test_demo01.py文件内容如下:

class TestDemo01():
    def __init__(self):
        pass

    def test_func(self):
        assert 1==1

class testDemo01():
    def test_func(self):
        assert 1 == 1

class DemoTest():
    def test_func(self):
        assert 1 == 1

class TestDemo02():
    def test_func(self):
        assert 1 == 1

    def testfunc(self):
        assert 1 == 1

    def func_test(self):
        assert 1==1

执行结果如下,可以发现只有TestDemo02类中的test_func和testfunc方法作为测试函数被识别到,其他的均不符合要求
WX20220512-143441.png

最后修改:2022 年 05 月 12 日
如果觉得我的文章对你有用,请随意赞赏