pytest参数化可变参数,pytest参数化接口测试

  pytest参数化可变参数,pytest参数化接口测试

  1.参数化解释1。unittest和pytest的参数化比较:pytest和unittest的一个重要区别是参数化,它是由unittest框架使用的第三方库ddt来参数化的。

  和pytest框架:

  前/后处理功能夹具有一个参数params,它专门与传递参数的请求结合使用,也可以与传递参数的请求结合使用。对于测试方法的参数化,直接使用decorator @ py test . mark . parameterize将参数传递给测试用例。2.参数化的目的:参数化是从测试过程中提取数据,通过参数传递不同的数据来驱动用例运行。其实就是数据驱动的概念。当测试用例只有不同的测试数据和预期结果,但操作步骤相同时,可以使用参数化来提高代码重用性,减少代码冗余。

  导入pytest

  #三个用例都是加法,然后断言某个值。重复写三个相似的用例有点多余。

  定义测试_1():

  断言3 5==9

  定义测试_2():

  断言2 4==6

  定义测试_3():

  断言6 * 9==42

  #优化后的参数化代码

  @ pytest . mark . parameterize( test _ input,expected ,[(3 5 ,8),( 2 4 ,6),( 6*9 ,42)])

  def test_eval(test_input,应为):

  Print(f 测试数据{测试输入},预期结果{预期} )

  assert eval(test_input)==应为

  if __name__==__main__ :

  pytest.main()参数化示例

  3.参数化的实际应用,比如Web UI自动化中的开发场景,比如登录框:

  你肯定需要测试空账号、空密码、空账号密码、不存在账号、密码错误、账号密码正确等情况。这些案例的区别在于输入的测试数据和对应的交互结果,所以我们只能编写一个登录测试案例,然后参数化多组测试数据和预期结果。节省大量代码。二。测试用例pytest的参数化@ py test . mark . parameterize @ py test . mark . parameterize(argnames,argvalues,indirect=false,ids=none,scope=none) argnames:参数名,字符串格式,多个参数用逗号分隔,如: arg1,arg2,arg3argvalues:参数值,需要对应argnames,元组或列表,如:[val1,val2,val3]。如果有多个参数实例,元组列表的一个元组对应一组参数值,比如:@ pytest . mark . parameter ize(Pw ,[(YY1 , 123 ),( YY2 , 123 ))(YY3 , 123)]) indirect:默认值为False,表示传入参数。如果设置为True,传入的参数将作为函数而不是参数执行。有关详细信息,请参见xxooids:自定义测试id,字符串列表。id的长度应该与测试数据列表的长度一致,并且应该标识每个测试用例,以便自定义测试数据结果的显示。为了增加可读性,1。单个参数@ pytest . mark . parameter ize()decorator接收两个参数,其中一个以字符串的形式标识用例函数。

  导入pytest

  #要测试的功能

  def add(a,b):

  返回a b

  #单参数的情况

  @ pytest . mark . parameter ize( a ,(1,2,3,4,5))

  Test _ add (a): #=作为用例参数,接收装饰器传入的数据。

  打印(值为 \ na:,a)

  assert add(a,1)==a 1

  结果:

  2.多个参数,多个参数,@ pytest . mark . parameter ize()的第一个参数还是一个字符串,应用实例的多个参数之间用逗号隔开。

  #多参数的情况

  @ pytest . mark . parameterize( a,b,c ,[(1,2,3),(4,5,9),( 1 , 2 , 12 )))

  def test_add(a,b,c):

  打印(f \ na,b,c的值:{a},{b},{c} )

  断言add(a,b)==c

  结果:

  3.整个测试类参数化测试类的参数化,实际上是将类中的测试方法参数化。

  类中测试方法的参数必须与@ py test . mark . parameter ize()中标识的参数个数一致。

  参数化的测试类将作用于每一个测试方法,比如下面两个用例。如果两个数据被参数化,它将被执行四次。

  #测试类参数化

  @ pytest . mark . parameterize( a,b,c ,[(1,2,3),(4,5,9)])

  类TestAdd():

  def test_add1(自身,a,b,c):

  断言add(a,b)==c

  def test_add2(自身,a,b,c):

  断言add(a,b)==c

  结果:

  4.多个参数化的乘法。在实际测试中,有些场景有多条件查询。比如登录有两种情况,名字两个密码四种情况,如果想全部涵盖的话2*4==8种情况。

  一般来说,手工测试不会涵盖所有这种情况,但是在自动化测试中,如果你愿意,你可以这样做。下面的例子:

  导入pytest

  类TestAdd():

  @ pytest . mark . parameterize( pwd ,[33,None,44,55])

  @ pytest . mark . parameter ize( name ,[11,22,])

  def test_add1(自我,姓名,密码):

  Print(fname:{name} pwd:{pwd} )结果:

  5.ids自定义测试id通过上面的运行结果,我们可以看到,为了区分参数化的运行结果,结果中会显示数据组合的名称。

  测试结果将自动生成测试id。自动生成的id简短易说。如果数据又长又复杂,那就难看了。

  @ pytest . mark . parameter ize()提供ids参数自定义显示结果,只是为了好看易读。

  id的长度应与测试数据列表的长度一致。

  像fixture的ids参数一样,可以引用fixture的ids。

  导入pytest

  类TestAdd():

  @ pytest . mark . parameter ize( name,pwd ,[(10,11),(20,21),(30,31)],ids=([张三,李四,王麻子]))

  def test_add1(自我,姓名,密码):

  Print(fname:{name} pwd:{pwd} )结果:

  第三,indirect=True parametrize与request结合使用,将参数传递给夹具。夹具本身的params参数可以与请求一起传递。详细内容请参考夹具其他参数的介绍章节。当然,parameterize可以用来代替params进行参数化。

  indirect=True参数用于将传入的ss_data作为函数而不是参数来执行。

  如果测试方法写在类中,@ py test . mark . parameter ize的参数名应该和@ pytest.fixture的函数名一致。

  应用场景:

  为了提高复用性,我们在编写测试用例时会使用不同的fixtures,比如:最常见的登录操作,大部分用例的前提是登录。假设不同用例想要登录不同的测试账号,登录fixture是写不死账号的,登录操作需要通过传递参数来完成。1.单参数导入pytest

  序列=[1,2,3]

  @pytest.fixture()

  定义ss_data(请求):

  打印( \ n参数%s% request.param )

  返回请求. param 1

  类别测试数据:

  @ pytest . mark . parameter ize( ss _ data ,seq,indirect=True)

  定义测试_1(自身,ss _数据):

  打印(“用例”,ss_data)结果:

  2.多参数@pytest.fixture()

  定义ss_data(请求):

  Print(f\n参数{request.param} )

  返回请求. param

  类别测试数据:

  # @ py test . mark . parameterize( ss_data ,seq) #有了这个,你会发现fixture根本不会被执行,因为默认情况下ss _ data是作为一个简单的参数而不是函数来执行的。

  @ pytest . mark . parameter ize( ss _ data ,seq,indirect=True)

  定义测试_1(自身,ss _数据):

  打印(“用例”,ss_data)结果:

  3.用多个夹具和多个参数化覆盖导入pytest

  seq1=[1,2,3]

  seq2=[4,5,6]

  @pytest.fixture()

  def get_seq1(请求):

  seq1=request.param

  打印( seq1:,seq1)

  返回seq1

  @pytest.fixture()

  def get_seq2(请求):

  seq2=request.param

  打印(第二季度:,第二季度)

  返回seq2

  @ pytest . mark . parameterize( get _ seq1 ,se Q1,indirect=True)

  @ pytest . mark . parameterize( get _ seq2 ,seq 2,indirect=True)

  def test_1(get_seq1,get_seq2):

  print(get_seq1,11)

  Print(get_seq2,22)结果:

  参考:

  全栈测试开发日记

  小菠萝

  转载请联系作者授权,否则将追究法律责任。

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

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