Selenium [已解决] unittest 求助--如何使同一个 testcase 反复执行多次?

Donly · 2017年11月13日 · 最后由 yxx 回复于 2018年06月26日 · 2503 次阅读

场景:同一个用例,输入不同的数据,执行步骤和判断结果方式完全一致

只是数据不同,除了封装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模样如下,可以自由控制数据量,从而控制用例执行次数:

共收到 26 条回复 时间 点赞
zhangjg0919 回复

第一次做自动化项目,ddt应该是指数据驱动吧?具体是要用什么其他的框架,还是怎么实现呢??多谢指教~~

Donly 回复

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]
zhangjg0919 回复

ddt正解,刚好解决了我的问题。另外,多谢你的信息,让我了解到了PO模式,虽然我之前自己也有重新封装,但还没有PO封装的好,正好提升一下自己!

c19950809 回复

恩恩,多谢你啦!这种方法也是可以,只是有一个不好的地方,就是无法多次执行setup和teardown。且每当数据增加或减少一条,都要去修改代码哦。用python 的ddt模块,自动根据数据的条数,决定了执行的次数,更方便更灵活哈

dongdong 回复

那如果这个变量的值是不确定的呢??要怎么办呢?我也是昨天才了解了python的ddt模块,真的十分方便。数据量自己控制,不用每改变数据量就去修改代码。

Donly #10 · 2017年11月14日 作者
taflo 回复

已使用,多谢!

可以用参数化unittest框架 (ParametrizedTestCase),我之前也纠结,但现在已经完美解决,数据用的yml,你可以百度一下

Donly #12 · 2017年11月14日 作者
Doraly-github 回复

恩,谢谢啦!

Donly 回复

ddt可以啊

Donly 回复

有两个问题请教下:
1、caseFlag = Params.caseFlag 这个Flag怎么来的? 我想在excel里增加skip标记
2、caseName = method.get_curfunc_name() 你这个是想修改报告里的case名称吗? 我试过不生效,有什么办法在excel里定义用例名称吗

Donly #15 · 2017年12月02日 作者

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)
#再调用写入报告函数

报告大致如下:

Donly 回复

方便加下微❤吗,请教下细节~
1三6三五45五3

Donly #17 · 2017年12月02日 作者

上班时间一般不上wechat哈,你可以加我Q,三27三三0三0三。另外,我也是新手来的。。。。

Donly 回复

楼主有没有遇到一种问题, 使用DDT时,报告里面的用例名称会拉取excel里面的数据
比如 excel 数据
excel_int,excel_str

跑出来的报告里的用例标题就是
test_001_excel_int_excel_str

Donly #19 · 2018年01月31日 作者
zhangjg0919 回复

不好意思,这个我没有留意额。。

zhangjg0919 回复

是的 我也发现这个问题了
连同表格中的数据也会添加在用例的名称后面,导致用例名称乱码,并且名称很长,不知道你是否已经解决这个问题,望指导

anna00 回复

本质上没解决,但是我把表格的宽和高写死,只显示一行。
真改的话,估计要修改ddt源码。暂时还没研究这个
如果您有啥想法,@我下哈。。

我是用的utx里的ddt框架,改了下支持case里自己增加case_name字段,然后显示在报告里

效果如下图:

utx github连接 https://github.com/jianbing/utx
ddt 源码应该也可以参考这个思路改

@unittest.skipIf(caseFlag['test_a_userAdd']['SkipFlag'] == "skip", "用户设置跳过该用例") 请问这个caseFlag是什么

Donly #24 · 2018年06月25日 作者
yxx 回复

这个是我自己在excel中定义的字段

我如何通过每条用例的skipflag这个字段去判断是否跳过用例,caseFlag['test_a_userAdd']['SkipFlag'] == "skip"这个具体的实现有吗,我现在用ddt做驱动,但是没办法做到excel表中某个用例跳过

我已经找到方法了,在从excel表中读取数据的时候把跳过的用例过滤掉

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册