只是数据不同,除了封装 testcase 时,手动多次加入该用例,有没有其他的办法实现该场景的??
ps:数据已实现从 exxel 中读入。
引入 python 的 ddt 模块,并从 excel 中读取测试数据。(还没有研究过从 json 或 yml 文件中读取应该怎么做(其实是我还不懂这两种格式。。),不过我个人更偏爱 excel)
import unittest
from ddt import data,ddt,file_data,unpack
...
@ddt
class UserManage(unittest.TestCase):
global caseFlag,testdata
caseFlag = Params.caseFlag
testdata = method.ExcelTestDataInit_list(DATAFILE,"test_a_userAdd")
def setUp(self):
print("UserManage Init!")
self.driver = webdriver.Firefox()
.....
def tearDown(self):
pass
@unittest.skipIf(caseFlag['test_a_userAdd']['SkipFlag'] == "skip", "用户设置跳过该用例")
@data(*testdata)
def test_a_userAdd(self,casedata):
driver = self.driver
caseName = method.get_curfunc_name()
realname = casedata["realName"]
department = casedata["department"]
username = casedata["UserName"]
.......
其中,testdata 读取出来后的内容为:
[{'UserName': 'autotest3', 'realName': '测试', 'department': '自动化测试部门'....},
{'UserName': 'autotest4', 'realName': '测试', 'department': '自动化测试部门'....}]
excel 模样如下,可以自由控制数据量,从而控制用例执行次数:
ddt 啊
DDT 就是数据驱动
自己搭框架啊 python + unittest + PO 模式 + ddt 应该就满足你的问题了。
另外,我也是小白。目前我做的 ui、接口测试就是用这种框架实现的。
ddt 我不懂拉。。。 我只想问 你们写程序的时候 没学过什么是变量吗
嘿嘿,也不知道你是不是这个意思,我的想法是将这个 testcase 作为一个公用的方法。然后在 testcase 中调用并且控制执行次数。
下面贴一小段 code。献丑了 哈哈。
import unittest
def add(x):
#读取数据,转化为数组、字典、矩阵等。
a = [1, 2, 3, 4]
b = [5, 6, 7, 8]
#业务计算逻辑。
return (a[x] + b[x])
class MyTest(unittest.TestCase):
def setUp(self):
print('setUp')
def test_case_B(self):
#可以返回数组长度作为循环停止的条件,视具体情况定。
for x in range(0, 4):
print(add(x))
#用断言对返回的结果做判断。
def tearDown(self):
print('tear down')
if __name__ == '__main__':
unittest.main()
执行结果如下:
setUp
6
8
10
12
tear down
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
[Finished in 0.1s]
ddt 正解,刚好解决了我的问题。另外,多谢你的信息,让我了解到了 PO 模式,虽然我之前自己也有重新封装,但还没有 PO 封装的好,正好提升一下自己!
恩恩,多谢你啦!这种方法也是可以,只是有一个不好的地方,就是无法多次执行 setup 和 teardown。且每当数据增加或减少一条,都要去修改代码哦。用 python 的 ddt 模块,自动根据数据的条数,决定了执行的次数,更方便更灵活哈
那如果这个变量的值是不确定的呢??要怎么办呢?我也是昨天才了解了 python 的 ddt 模块,真的十分方便。数据量自己控制,不用每改变数据量就去修改代码。
可以用参数化 unittest 框架 (ParametrizedTestCase),我之前也纠结,但现在已经完美解决,数据用的 yml,你可以百度一下
有两个问题请教下:
1、caseFlag = Params.caseFlag 这个 Flag 怎么来的? 我想在 excel 里增加 skip 标记
2、caseName = method.get_curfunc_name() 你这个是想修改报告里的 case 名称吗? 我试过不生效,有什么办法在 excel 里定义用例名称吗
1、caseFlag = Params.caseFlag 这个 Flag 怎么来的? 我想在 excel 里增加 skip 标记
RE:这个 flag 是我从 excel 中读取出来的,这里是一个 case 对应一行。数据对应 excel 如下:
2、caseName = method.get_curfunc_name() 你这个是想修改报告里的 case 名称吗? 我试过不生效,有什么版本在 excel 里定义用例名称吗
RE:这个的确是想在报告里记录 case 的名称,get_curfunc_name() 这个函数封装的是获取当前调用它的对象的名称,这里也就是 case 的名称了。
def get_curfunc_name():
return (sys._getframe().f_back.f_code.co_name)
def get_backfunc_name():
return (sys._getframe().f_back.f_back.f_code.co_name)
.......
#casename和其他要记录进入报告的数据,封装在一个list里面,最后再统一写入excel
data = [caseName, "新增用户"]
data.append(info)
#再调用写入报告函数
报告大致如下:
楼主有没有遇到一种问题, 使用 DDT 时,报告里面的用例名称会拉取 excel 里面的数据
比如 excel 数据
excel_int,excel_str
跑出来的报告里的用例标题就是
test_001_excel_int_excel_str
我是用的 utx 里的 ddt 框架,改了下支持 case 里自己增加 case_name 字段,然后显示在报告里
效果如下图:
utx github 连接 https://github.com/jianbing/utx
ddt 源码应该也可以参考这个思路改
@unittest.skipIf(caseFlag['test_a_userAdd']['SkipFlag'] == "skip", "用户设置跳过该用例") 请问这个 caseFlag 是什么
我如何通过每条用例的 skipflag 这个字段去判断是否跳过用例,caseFlag['test_a_userAdd']['SkipFlag'] == "skip"这个具体的实现有吗,我现在用 ddt 做驱动,但是没办法做到 excel 表中某个用例跳过
我已经找到方法了,在从 excel 表中读取数据的时候把跳过的用例过滤掉
@unittest.skipIf(caseFlag['test_a_userAdd']['SkipFlag'] == "skip", "用户设置跳过该用例"),想问一下这个是怎么实现的呢