如何使用不同参数组合生成独立的TestCase函数(Python)
2014-11-07 00:56
931 查看
在使用selenium2 Python做自动化测试的时候遇到个问题,写一个testcase 生成报告后,会有一个case的执行状态记录。这样我们写一个登录功能的自动化用例,只写一个case显然是不行的,测试用例要满足他的覆盖度,所以我们需要写多个用例。但是对于同样的功能,我们用例脚本体现出来的只有输入的参数值不一样,其它操作都是一样的。
这时候一个用例写一个test_case_login()的脚本,但是我们又想在报告中单独记录每一个case的执行状态,不得写多个重复的方法。 如: test_case_login_1() test_case_login_2() test_case_login_3() 这样执行完成后,使用unittest的进行生成测试报告,对每一个test_case都能记录执行状态。但是代码太过冗余,内容太过笨重。 或许此时我们可以仅写一个test case并用内嵌循环来进行,但是会出现一个问题,就是其中一个出了错误,很难从测试结果里边看出来。 问题的关键在于是否有办法根据输入参数的不同组合产生出对应的test case。 比如我5组数据,就应该有5个test_case_login,上面我已经说过不适合直接写5个test_case_login,那么应该怎么做呢? 一种可能的思路是不利用unittest.TestCase这个类框中的test_成员函数的方法,而是自己写runTest这个成员函数,那样会有一些额外的工作,而且看起来不是那么“智能”,如果目的是让框架自动调用test_case
自然的思路就是 • 利用setattr来自动为已有的TestCase类添加成员函数 • 为了使这个方法凑效,需要用类的static method来生成decorate类的成员函数,并使该函数返回一个test函数对象出去 • 在某个地方注册这个添加test成员函数的调用(只需要在实际执行前就可以,可以放在模块中自动执行亦可以手动调用) 用例数据如下:
代码如下:
这时候一个用例写一个test_case_login()的脚本,但是我们又想在报告中单独记录每一个case的执行状态,不得写多个重复的方法。 如: test_case_login_1() test_case_login_2() test_case_login_3() 这样执行完成后,使用unittest的进行生成测试报告,对每一个test_case都能记录执行状态。但是代码太过冗余,内容太过笨重。 或许此时我们可以仅写一个test case并用内嵌循环来进行,但是会出现一个问题,就是其中一个出了错误,很难从测试结果里边看出来。 问题的关键在于是否有办法根据输入参数的不同组合产生出对应的test case。 比如我5组数据,就应该有5个test_case_login,上面我已经说过不适合直接写5个test_case_login,那么应该怎么做呢? 一种可能的思路是不利用unittest.TestCase这个类框中的test_成员函数的方法,而是自己写runTest这个成员函数,那样会有一些额外的工作,而且看起来不是那么“智能”,如果目的是让框架自动调用test_case
自然的思路就是 • 利用setattr来自动为已有的TestCase类添加成员函数 • 为了使这个方法凑效,需要用类的static method来生成decorate类的成员函数,并使该函数返回一个test函数对象出去 • 在某个地方注册这个添加test成员函数的调用(只需要在实际执行前就可以,可以放在模块中自动执行亦可以手动调用) 用例数据如下:
case_id | summary | login_name | login_password | remark |
case_0001 | 用户名为空的验证 | 111111 | 请输入用户名 | |
case_0002 | 密码为空的验证 | admin | 请输入密码 | |
case_0003 | 错误的用户名验证 | lidje | 111111 | 对不起,你的校园通账户与密码不能通过系统认证 |
case_0004 | 错误的密码验证 | admin | ddsss | 对不起,你的校园通账户与密码不能通过系统认证 |
case_0005 | 正确的用户名、密码验证 | admin | 111111 | 登录成功 |
# -*- coding: utf-8 -*- from selenium import webdriver import sys sys.path.append("public") from public import location from public import plogin126mail from test import test_support import unittest import xlrd importConfigParser classLogin126Mail(unittest.TestCase): def setUp(self): print"start" self.driver = webdriver.Chrome() self.driver.implicitly_wait(30) #声明find_element方法 self.fd = location self.verificationErrors =[] #载入ini配置文件 cf =ConfigParser.ConfigParser() cf.read("..\\data\\login_126mail_data.ini") #读取配置数据 self.base_url = cf.get("urlconf","url") #定义用户名密码变量 # self.username = "auto_tester" # self.password = "123qwe" #定位关键字变量 self.userinput = cf.get("keywords","userinput") self.passinput = cf.get("keywords","passinput") self.btnsubmit = cf.get("keywords","btnsubmit") self.errorwords = cf.get("keywords","errorwords") self.useridwords = cf.get("keywords","useridwords") self.lg = plogin126mail.PubLogin("login") def action(self, case_id, case_summary, username, password): self.driver.get(self.base_url) self.driver.maximize_window() print u"========【"+ case_id + u"】"+ case_summary + u"=============" print username print password self.lg.login(username, password, self.driver, self.userinput, self.passinput, self.btnsubmit) spanTF =True try: errortxt = self.fd.findCss(self.driver, self.errorwords).text spanTF =True except: spanTF =False if spanTF: print errortxt else: print self.driver.title self.assertTrue(self.fd.findId(self.driver, self.useridwords).text, u"登录跳转失败!") @staticmethod def getTestFunc(case_id, case_summary, username, password): def func(self): self.action(case_id, case_summary, username, password) return func def tearDown(self): print"finished" self.driver.quit() self.assertEqual([], self.verificationErrors) def __generateTestCases(): data = xlrd.open_workbook(u"..\\data\\login_126mail_data.xls") #通过索引顺序获取Excel表 table = data.sheets()[0] for args in range(1, table.nrows): txt = table.row_values(args) setattr(Login126Mail,'test_login126mail_%s'% txt[0],Login126Mail.getTestFunc(*txt)) __generateTestCases() def test_main(): test_support.run_unittest(Login126Mail)
相关文章推荐
- python 9-1 如何使用函数装饰器,定义函数装饰器,用来生成一个原函数基础添加新功能的函数,替代原函数
- 第 0001 题:做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)?
- 做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)?
- Python中unittest采用不同的参数组合产生独立的test case
- 做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)?
- 如何使用定时器settimeout、setInterval执行能传递参数的函数
- 在不同编译环境中如何使用sleep()函数
- Python中如何使用*args 和 **kwargs (非keyworded,可变长度参数列表 keyworded形式可变长度的参数列表)
- 如何使用定时器settimeout、setInterval执行能传递参数的函数
- Python中如何避免使用多个分支语句(多个if和else)——函数字典(Function Map)简介
- 在不同编译环境中如何使用sleep()函数
- 如何使用定时器settimeout、setInterval执行能传递参数的函数
- python中函数参数传递*和%使用
- 二维数组做函数参数,如何将三维数组降为二维数组,指向数组的指针的使用
- [转]可爱的 Python:: 使用 itertools 模块中的组合函数
- Linux下静态库_库的基本概念;如何生成静态库动态库;nm查看库中包含那些函数、ar生成静态库,查看库中包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与库相关的参数-L,-l,-f
- 如何使用定时器settimeout、setInterval执行能传递参数的函数
- Linux下静态库_库的基本概念;如何生成静态库动态库;nm查看库中包含那些函数、ar生成静态库,查看库中包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与库相关的参数-L,-l,-f
- python 装饰器功能以及函数参数使用
- 如何使用setInterval执行带有参数的函数