pytest中fixture,pytest fixtures

  pytest中fixture,pytest fixtures

  Setup和teardown可以在测试用例执行之前或之后做一些操作,但这是整个测试脚本的全局效果;

  如果我们想在一些用例执行前登录,而一些用例执行前不需要登录,这种场景再次使用setup和teardown是无法实现的,这时就需要使用fixture函数。

  fixture函数的参数描述(scope= function ,params=none,autouse=false,ids=none,name=none): 1。范围:夹具功能的范围;可选值:函数(默认)、类、模块、会话

  函数:作用于每个方法或函数,每个方法或函数运行一次。class:作用于整个类,每个类中的所有测试只运行一次。模块:作用于整个模块,每个模块中的所有测试只运行一次。session:作用于整个会话,整个会话只运行一次(小心)。2.params:列表类型;可选参数列表;它会多次调用fixture标记的方法以及所有使用这个fixture的测试用例;默认值为无;可以使用request.param获取当前调用参数

  3.autouse:如果为True,将为所有测试用例激活fixture,测试用例运行时,fixture标记的方法将自动运行;如果为False,您需要显示名称来激活设备,它将不会自动运行。

  4.ID:ID字符串列表,对应于params,所以它们也是测试的一部分。如果没有提供ids,它将从参数中自动生成。

  5.名称:名称:夹具的名称。默认值是fixture装饰器标记的函数名。

  夹具1的使用。通过参数引用夹具功能。示例:

  #文件名:测试夹具. py

  导入pytest

  类测试_A:

  @pytest.fixture()

  之前定义(自身):

  打印( \n -在夹具运行之前-)

  Test _ a (self,before):# test _ a方法作为参数传入fixture标记的函数中,fixture的名称默认为fixture标记的函数的名称。

  打印(-测试_a已运行-)

  断言1

  if __name__==__main__ :

  Test.main ([-s , test _ fixture.py])运行结果:

  从结果可以看出,fixture标记的before函数将在测试用例test _ a之前运行。

  2.使用名称参数引用夹具功能名称参数表示夹具的重命名;

  一般来说,使用fixture的测试函数会将fixture的函数名作为参数传递,但是pytest也允许重命名fixture。

  示例1:

  #文件名:测试夹具. py

  导入pytest

  类测试_A:

  @ pytest . fixture(name= before _ fixture _ name )

  之前定义(自身):

  打印( \n -在夹具运行之前-)

  Test _ a (self,before_fixture_name):将# test _ a方法作为参数传入fixture标记的函数中,这里的fixture名称为:before _ fixture _ name。如果没有设置name参数,那么默认情况下,fixture的名称将是fixture所标记的函数的名称。

  打印(-测试_a已运行-)

  断言1

  if __name__==__main__ :

  Test.main ([-s , test _ fixture.py])例2:重命名一个fixture函数后,不能用fixture函数的函数名调用,只能用fixture函数重命名的新名称调用。

  3.以@ pytest . mark . use fixtures( fixture function name )函数的形式引用fixture函数。例如:

  #文件名:测试夹具. py

  导入pytest

  由fixtures标记的@ pytest.fixture () #函数也可以在测试类之外应用,并通过使用@ py test . mark . use fixtures()decorator来引用。

  之前定义():

  打印( \n -在夹具运行之前-)

  @ pytest . mark . usefixtures( before )#通过使用usefixtures()引用fixtures,当use fixtures()函数的参数是fixture函数的函数名时。

  类测试_A:

  定义测试_a(自身):

  打印(-测试_a已运行-)

  断言1

  if __name__==__main__ :

  Test.main ([-s , test _ fixture.py])运行结果:

  从结果可以看出,fixture标记的before函数将在测试用例test _ a之前运行。

  4.通过autouse=True设置夹具功能的默认执行夹具功能的autouse参数等于False默认情况下;

  如果fixture函数的autouse参数为真,那么每个测试函数都会自动调用fixture函数,不需要传入fixture函数的名称。

  示例:

  #文件名:测试夹具. py

  导入pytest

  @pytest.fixture(autouse=True) #通过参数autouse=True设置fixture的默认操作。

  之前定义():

  打印( \n -在夹具运行之前-)

  类测试_A:

  定义测试_a(自身):

  打印(-测试_a已运行-)

  断言1

  定义测试_b(自身):

  打印(- test_b已运行-)

  断言1

  if __name__==__main__ :

  Test.main ([-s , test _ fixture.py])运行结果:

  从结果中可以看出,我们没有指定test_a和test_b使用fixture,但是fixture是在测试用例执行之前执行的。这是因为我们将fixture设置为autouse=True。

  5.夹具的范围设置为功能。例如:

  #文件名:测试夹具. py

  导入pytest

  @ pytest . fixture(scope= function ,autouse=True) #作用域设置为function,fixture默认操作由参数autouse=True设置。

  之前定义():

  打印( \n -在夹具运行之前-)

  类测试_A:

  定义测试_a(自身):

  打印(-测试_a已运行-)

  断言1

  定义测试_b(自身):

  打印(- test_b已运行-)

  断言1

  if __name__==__main__ :

  Test.main ([-s , test _ fixture.py])运行结果:

  从结果中可以看出,fixture的作用域设置为scope=function后,fixture标记的函数会在每个测试用例执行前执行一次。

  并且通过和前面的例子对比,可以看到设置scope=function和不设置scope参数的执行结果是一致的,说明scope参数的默认值是function。

  6.fixture的范围被设置为class。例如:

  #文件名:测试夹具. py

  导入pytest

  @ pytest.fixture (scope= class ,autouse=True) #作用域设置为class,fixture的默认操作由参数autouse=True设置。

  之前定义():

  打印( \n -在夹具运行之前-)

  类测试_A:

  定义测试_a(自身):

  打印(-测试_a已运行-)

  断言1

  定义测试_b(自身):

  打印(- test_b已运行-)

  断言1

  if __name__==__main__ :

  Test.main ([-s , test _ fixture.py])运行结果:

  从运行结果可以看出,测试类中有两个测试用例,但是fixture只执行一次。

  7.使用fixture返回值的例子:

  #文件名:测试夹具. py

  导入pytest

  @pytest.fixture()

  def返回数据():

  打印( \n -在夹具运行之前-)

  2 #返回值

  类测试_A:

  def test_a(self,return_data):

  打印(-测试_a已运行-)

  Assert 1==return_data #获取返回值并做断言。

  if __name__==__main__ :

  Test.main ([-s , test _ fixture.py])运行结果:

  从结果可以看出,fixture的返回值是2,在测试用例中断言返回值,断言失败。

  8.使用夹具的params参数params参数是夹具功能的可选参数表,支持列表输入;

  不传递该参数时,默认为无;

  每个param值的fixture函数都会被调用执行一次,类似于for循环。

  可以和参数id一起使用,作为每个参数的标识,类似于ids在用例参数化中的作用。

  示例:

  #文件名:测试夹具. py

  导入pytest

  @pytest.fixture(params=[1,2,3])

  DEF _ DATA (request): #传入参数请求,请求系统内置的fixture。

  打印( \n -在夹具运行之前-)

  Request.param #通过Request.param获取当前传入的参数。

  类测试_A:

  def test_a(self,return_data):

  Print (-test _ a已运行,return _ data的值为:{}-。format (return _ data))

  Assert 1==return_data #获取返回值并做断言。

  if __name__==__main__ :

  Test.main ([-s , test _ fixture.py])运行结果:

  从结果中,我们可以看到测试用例被执行了三次。设置params参数会导致fixture标记的函数被多次调用,使用fixture函数的测试用例会被多次执行。

  9.夹具的params参数与ids参数相结合。在fixture函数中配置ids参数之前:用例执行后的标识符是传递的params参数。

  fixture函数配置ids参数后:用例执行后的ID是传入的ids参数。并与params参数一一对应。

  10.fixture函数的相互调用(fixture函数之间的依赖)示例1:

  导入pytest

  # fixtrue作为参数,调用对方传入

  @pytest.fixture()

  定义帐户():

  a=账户

  打印(“第一层夹具”)

  返回a

  #Fixture的相互调用必须调用测试类中的这一层Fixture,普通函数的单独调用不会生效。

  @pytest.fixture()

  定义登录(帐户):

  打印(“第二层夹具”)

  类测试登录:

  def test_1(自己,登录):

  Print(直接使用二级夹具,返回值为{} 。格式(登录))

  def test_2(自身,账户):

  Print(只调用account fixture,返回值为{} 。格式(账户))

  if __name__==__main__ :

  Pytest.main()运行结果1:

  2:比如一个fixture函数依赖于另一个fixture函数,此时就不能用@pytest.mark.usefixtures()调用依赖的fixture函数,这种调用方式不会生效。

  需要通过函数传递才能生效。

  #测试_夹具_02.py

  导入pytest

  @pytest.fixture()

  def login_weibo():

  打印(===========登陆微博==========)

  @pytest.fixture()

  # @ pytest . mark . use fixtures( log in _ Weibo )#这种方式不会生效

  Get _ Weibo _ data (login _ Weibo): #此方式生效。

  fixture函数依赖于它,它需要传递函数

  打印(=========获取微博数据===========)

  @pytest.mark.demo

  类TestMyCode:

  @ pytest . mark . use fixtures( get _ Weibo _ data )

  def test_fixture_005(自身):

  fixture函数在测试脚本文件“”中

  断言1==1运行结果2:

  [注意]

  尽管fixture函数支持相互调用,但不支持普通函数直接使用fixture。在调用逐步生效之前,必须在测试函数中调用它。

  当有多层fixture函数调用时,首先执行最后一层fixture函数,而不是传入测试函数的fixture函数。

  上层夹具功能的值不会自动返回。在这里,逻辑类似于函数相互调用。[需要将函数调用值赋给变量并使用]

  期待陌生,拥抱惊喜。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: