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

donly · 2017年11月13日 · 最后由 Snowshuang 回复于 2020年08月19日 · 4493 次阅读

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

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

共收到 27 条回复 时间 点赞

ddt 啊

皆非 回复

第一次做自动化项目,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]
皆非 回复

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

疯的蜗牛 回复

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

donly #19 · 2017年11月14日 Author
心向东 回复

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

donly #10 · 2017年11月14日 Author
chen 回复

已使用,多谢!

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

donly #12 · 2017年11月14日 Author
Doraly 回复

恩,谢谢啦!

donly 回复

ddt 可以啊

donly 回复

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

donly #15 · 2017年12月02日 Author
风中骄子 回复

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 #11 · 2017年12月02日 Author
风中骄子 回复

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

donly 回复

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

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

皆非 回复

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

皆非 回复

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

test 回复

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

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

效果如下图:

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

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

yxx 回复

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

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

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

@unittest.skipIf(caseFlag['test_a_userAdd']['SkipFlag'] == "skip", "用户设置跳过该用例"),想问一下这个是怎么实现的呢

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