小言_互联网的博客

自动化测试之ddt数据驱动

483人阅读  评论(0)

一、ddt 用途

  • 一般进行接口测试时,每个接口的传参都不止一种情况,一般会考虑正向、逆向等多种组合,所以在测试一个接口时,通常会编写多条 case,而这些除了传参不同外,并没有什么区别。这个时候就可以利用 ddt 来管理测试数据,提高代码复用率。
  • ddt => data driver test 数据驱动测试

二、安装 ddt

  • pip install ddt
三、ddt 模块组成
  • ddt.ddt:装饰类,也就是继承 TestCase 的类。

  • ddt.data:装饰测试方法,参数是一系列的值

  • ddt.file_data:装饰测试方法,参数是文件名。文件可以是 json 或者 yaml 类型。

    • 注意:如果文件是以 “.yml”或者".yaml" 结尾,ddt 会作为 yaml 类型处理,其他文件都会作为 json 文件处理。  

    • 如果文件是列表,列表的值会作为测试用例参数,同时,会作为测试用例方法名后缀显示。  

    • 如果文件是字典,字典的 key 会作为测试用例方法的后缀显示,字典的 value 会作为测试用例参数。  
  • ddt.unpack:用来拆解 data 的数据。传递的是复杂的数据结构时使用,比如使用列表或者元组,添加 unpack 后,ddt 会自动把元组或者列表对应到多个参数上

四、示例
  • 使用 data 传参数给测试用例
    • 如下示例,可以看出 data 分别传参数 2 和 4 给测试用例,然后测试用例执行了两遍

     
  1. from ddt import ddt, data
  2. import unittest
  3. @ddt
  4. class MyTestDdt(unittest.TestCase):
  5. def setUp(self):
  6. print( 'start')
  7. @data(2, 4) # 使用 data 传参数给测试用例
  8. def test_one(self,value):
  9. print( 'the @data number is {}'.format(value))
  10. def tearDown(self):
  11. print( 'end')
  12. if __name__ == '__main__':
  13. unittest.main()
  14. # 结果如下:
  15. start
  16. the @data number is : 2
  17. end
  18. start
  19. the @data number is : 4
  20. end
  • 使用 unpack 分解 list 或者 tuple
    • 可以看出 data 分别传元组参数(1,2)和(4,5)给测试用例,然后测试用例执行了两遍  

     
  1. from ddt import ddt, data, unpack
  2. import unittest
  3. @ddt
  4. class MyTestDdt(unittest.TestCase):
  5. def setUp(self):
  6. print( 'start')
  7. @data(( 1, 2), ( 4, 5)) # 元组
  8. @unpack # 二次分解元组
  9. def test_one(self, value1, value2):
  10. print( 'the @data number is {} and {}'.format(value1, value2))
  11. def tearDown(self):
  12. print( 'end')
  13. if __name_ _ == '__main__':
  14. unittest.main()
  15. # 结果如下
  16. start
  17. the @data number is 1 and 2
  18. end
  19. start
  20. the @data number is 4 and 5
  21. end
  •  用 unpack 分解字典

     
  1. from ddt import ddt, data, unpack
  2. import unittest
  3. @ddt
  4. class MyTestDdt(unittest.TestCase):
  5. def setUp(self):
  6. print( 'start')
  7. @data({ 'value1': 1, 'value2': 2}, { 'value1': 3, 'value2': 4}) # 字典
  8. @unpack
  9. def test_one(self, value1, value2):
  10. print( 'the @data number is {} and {}'.format(value1, value2))
  11. def tearDown(self):
  12. print( 'end')
  13. if __name_ _ == '__main__':
  14. unittest.main()
  15. # 结果如下
  16. start
  17. the @data number is 1 and 2
  18. end
  19. start
  20. the @data number is 3 and 4
  21. end

     
  1. from ddt import ddt, data, unpack
  2. import unittest
  3. @ddt
  4. class MyTestDdt(unittest.TestCase):
  5. def setUp(self):
  6. print( 'start')
  7. @data(*[{ 'value1': 1, 'value2': 2}, { 'value1': 3, 'value2': 4}]) # 这里加 * 后会将返回数据分为一个个的字典
  8. @unpack
  9. def test_one(self, **value):
  10. print( 'the @data number is {} and {}'.format(value.get( "value1"), value.get( "value2")))
  11. def tearDown(self):
  12. print( 'end')
  13. if __name_ _ == '__main__':
  14. unittest.main()
  15. # 结果如下
  16. start
  17. the @data number is 1 and 2
  18. end
  19. start
  20. the @data number is 3 and 4
  21. end

转载:https://blog.csdn.net/Mark_Zhengy/article/details/109303222
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场