今天开始学习了pytest测试框架的初级内容,主要实践的内容入下

1、pytest中用例执行的两种方式,模式:

  • 直接在comd命令行中执行:pytest ./test_ABC.py   -----一定要在.py所在的文件夹执行,否则找不到文件
  • 在pycharm中使用main函数:pytest.main(["-s","test_ABC.py"])

2、pytest执行的用例方法必须以test开头或结尾,定义的测试用例类以Test开头,默认执行时只调用内部的test开头的用例

setup()和teardown()方法会在每个test用例方法执行前后执行

setup_class()和teardown_class()方法会在每个Test类调用测试用例之前执行一次,名称必须完全一致,如果写成setUp_class()等一个错误的名称,在测试用例类中的测试用例执行前都不会执行,也不会报错,所以名称必须完全一致

3、测试用例结果通过assert来判断

如果一个用例没有assert则,默认是通过的状态(pass可以存在,也可以不写,实际用例是否通过,仍然以assert的结果为准),assert判断的方式有几种,如下:

assert xx  判断xx为真,只要xx不写0,就是真(或者直接写一个pass,代表这个用例测试通过)

·assert not xx 判断xx不为真

·assert a in b 判断b包含a,a可以是一个object(此object对应的类必须实现的--eq--()函数),b为一个列表,

·assert a == b 判断a等于b

·assert a != b 判断a不等于b

4、fixture可以声明function,module,fixture

生成一个参数,直接在用例的传参中使用,只要声明了,在测试用例方法和类内部的测试用例方法中,都可以调用,但是setup函数和teardown函数不能调用,功能确实很强大,

因为fixture默认的作用域是一个function(就是在每个测试用例方法开始前都执行一次),所以注意不能在测试用例类的内部定义@pytest.fixture()修饰的函数,否则,类内部的所有用例都无法执行,也不能在setup_class()和teardown_class()中使用参数

从pytest的官网,获取了一个例子,就是介绍fixtures的使用的,如下所示:

import pytest

class Fruit:
    def __init__(self, name):
        self.name = name

    def __eq__(self, other):
        return self.name == other.name

@pytest.fixture
def my_fruit():
    print("\n-----my_fruit() function--------")
    return Fruit("apple")


@pytest.fixture
def fruit_basket(my_fruit):
    print("\n-----fruit_basket() function--------")
    return [Fruit("banana"), my_fruit]


def test_my_fruit_in_basket(my_fruit, fruit_basket):
    assert my_fruit in fruit_basket

运行的结果是:

collected 1 item

test_Fruit.py 
-----my_fruit() function--------

-----fruit_basket() function--------
.

============================== 1 passed in 0.72s ==============================

实际上,my_fruit()函数只调用了一次,而不是调用两次,我也很惊讶,明明在调用test_my_fruit_in_basket()用例时调用了一次,然在初始化fruit_basket时有调用了一次,为啥只打印了一次,说明fixture参数实例化对象,传入方法作为实际对象值时,只会初始化一次,无论那个方法(fixture修饰的方法,或者setup等初始化方法、最后测试用例方法)调用,都是直接使用同名的方法创建的唯一的object