ddt
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")