自动化测试框架学习总结

ddt

自动化测试框架学习总结_第1张图片

import ddt
import unittest2
from func.csvFileManager2 import reader
from test_case.BaseTestCase import BaseTestCase


@ddt.ddt
class Register3Test(BaseTestCase):
    table = reader("register_test_cases.csv")
    
    @ddt.data(*table)
    def test_register(self, row):
        self.driver.get("http://172.31.14.251/index.php?m=user&c=public&a=reg")
        self.driver.find_element_by_name("username").send_keys(row[0])
        self.driver.find_element_by_name("password").send_keys(row[1])
        self.driver.find_element_by_name("userpassword2").send_keys(row[2])
        self.driver.find_element_by_name("mobile_phone").send_keys(row[3])
        self.driver.find_element_by_name("email").send_keys(row[4])
        print(self.table) # 不加星号,表示一个变量,就是列表本身,如:[1,2,3,4]
        print(*self.table) # 加上星号,表示4个变量,把列表中每个元素看成一个单独的变量,如:1 2 3 4

ddt 是第三方模块,需安装, pip install ddt
DDT包含类的装饰器ddt和两个方法装饰器data(直接输入测试数据)
通常情况下,data中的数据按照一个参数传递给测试用例,如果data中含有多个数据,以元组,列表,字典等数据,需要自行在脚本中对数据进行分解或者使用unpack分解数据。
@data(a,b)
那么a和b各运行一次用例
@data([a,d],[c,d])
如果没有@unpack,那么[a,b]当成一个参数传入用例运行
如果有@unpack,那么[a,b]被分解开,按照用例中的两个参数传递

import unittest
from ddt import ddt,data,unpack

@ddt
class MyTesting(unittest.TestCase):
    def setUp(self):
        print('this is the setUp')
    @data([1,2,3])
    def test_1(self,value):
        print(value)

    @data([3,2,1],[5,3,2],[10,4,6])
    @unpack
    def test_minus(self,a,b,expected):
        actual = int(a) - int(b)
        expected = int(expected)
        self.assertEqual(actual, expected)

    @data([2,3],[4,5])
    def test_compare(self,a,b):
        self.assertEqual(a,b)

    def tearDown(self):
        print('this is tearDown')

if __name__ == '__main__':
    unittest.main(verbosity=2)

测试套:

方法一:

discover=unittest.defaultTestLoader.discover(testdir,pattern=row[1])
runner=unittest.TextTestRunner()
runner.run(discover)

方法二:

suite=unittest.TestSuite()
suite.addTest(类名("方法名"))
runner=unittest.TextTestRunner()
runner.run(suite)
suite=unittest.TestSuite()
suite.addTests(类名1("方法名1","方法名2"),类名2("方法名1","方法名2"))
runner=unittest.TextTestRunner()
runner.run(suite)

方法三:

discover=unittest.defaultTestLoader.discover(脚本路径,pattern=文件名,top_level_dir=prj_path)
runner=HTMLTestRunner(stream=报告文件路径,title="XX测试报告",description="xx测试描述")
runner.run(discover)

unitTest中的 discover 第三个参数 top_level_dir 第一次运行时如果为None 会取当前传入的start_dir所在路径为 top_level_dir
而这个top_level_dir会作为self的参数保存下来,这样第二次运行时 top_level_dir实际取的是上一次的路径,直接影响到了下一次的运行
因此规避此问题的方法
1 要么在一次运行过程中只调用一次 discover
2 如果一定要调用两次,第二次需要手动将 top_level_dir这个参数传给discover方法,这样才能运行不同文件夹下的用例

生成报告文件名中可以加入当前时间,以防止覆盖
获取当前时间
now=time.strftime("%y_%m_%d %H-%M-%S")

你可能感兴趣的:(自动化测试框架学习总结)