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

Donly · 发布于 2017年11月13日 · 最后由 Donly 回复于 2018年01月31日 · 230 次阅读

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

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

共收到 19 条回复
765f22

ddt啊

D99fd3
Donly · 2楼 · 2017年11月13日 作者
765f22zhangjg0919 回复

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

765f22
D99fd3Donly 回复

DDT 就是数据驱动
自己搭框架啊 python + unittest + PO模式 + ddt 应该就满足你的问题了。
另外,我也是小白。目前我做的ui、接口测试就是用这种框架实现的。

6233

ddt 我不懂拉。。。 我只想问 你们写程序的时候 没学过什么是变量吗😂

E2277b

嘿嘿,也不知道你是不是这个意思,我的想法是将这个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]
D99fd3
Donly · 7楼 · 2017年11月14日 作者
765f22zhangjg0919 回复

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

D99fd3
Donly · 8楼 · 2017年11月14日 作者
E2277bc19950809 回复

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

D99fd3
Donly · 9楼 · 2017年11月14日 作者
6233dongdong 回复

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

D99fd3
Donly · 10楼 · 2017年11月14日 作者
5837taflo 回复

已使用,多谢!

95b64a

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

D99fd3
Donly · 12楼 · 2017年11月14日 作者
95b64aDoraly-github 回复

恩,谢谢啦!

Db42eb
D99fd3Donly 回复

ddt可以啊

878fa7
D99fd3Donly 回复

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

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

报告大致如下:

878fa7
D99fd3Donly 回复

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

D99fd3
Donly · 17楼 · 2017年12月02日 作者

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

765f22
D99fd3Donly 回复

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

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

D99fd3
Donly · 19楼 · 2018年01月31日 作者
765f22zhangjg0919 回复

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

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