如何使用不同参数组合生成独立的TestCase函数(Python)

在使用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成员函数的调用(只需要在实际执行前就可以,可以放在模块中自动执行亦可以手动调用) 用例数据如下:

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 登录成功

代码如下:

  1.  1 # -*- coding: utf-8 -*-
     2 from selenium import webdriver
     3 import sys
     4 sys.path.append("public")
     5 from public import location
     6 from public import plogin126mail
     7 from test import test_support
     8 import unittest
     9 import xlrd
    10 importConfigParser
    11
    12 classLogin126Mail(unittest.TestCase):
    13 def setUp(self):
    14 print"start"
    15  self.driver = webdriver.Chrome()
    16  self.driver.implicitly_wait(30)
    17 #声明find_element方法
    18 self.fd = location
    19  self.verificationErrors =[]
    20 #载入ini配置文件
    21 cf =ConfigParser.ConfigParser()
    22  cf.read("..\\data\\login_126mail_data.ini")
    23 #读取配置数据
    24 self.base_url = cf.get("urlconf","url")
    25 #定义用户名密码变量
    26 # self.username = "auto_tester"
    27 # self.password = "123qwe"
    28 #定位关键字变量
    29 self.userinput = cf.get("keywords","userinput")
    30  self.passinput = cf.get("keywords","passinput")
    31  self.btnsubmit = cf.get("keywords","btnsubmit")
    32  self.errorwords = cf.get("keywords","errorwords")
    33  self.useridwords = cf.get("keywords","useridwords")
    34  self.lg = plogin126mail.PubLogin("login")
    35
    36 def action(self, case_id, case_summary, username, password):
    37  self.driver.get(self.base_url)
    38  self.driver.maximize_window()
    39 print u"========【"+ case_id + u"】"+ case_summary + u"============="
    40 print username
    41 print password
    42  self.lg.login(username, password, self.driver, self.userinput, self.passinput, self.btnsubmit)
    43  spanTF =True
    44 try:
    45  errortxt = self.fd.findCss(self.driver, self.errorwords).text
    46  spanTF =True
    47 except:
    48  spanTF =False
    49 if spanTF:
    50 print errortxt
    51 else:
    52 print self.driver.title
    53  self.assertTrue(self.fd.findId(self.driver, self.useridwords).text, u"登录跳转失败!")
    54
    55 @staticmethod
    56 def getTestFunc(case_id, case_summary, username, password):
    57 def func(self):
    58  self.action(case_id, case_summary, username, password)
    59 return func
    60
    61
    62 def tearDown(self):
    63 print"finished"
    64  self.driver.quit()
    65  self.assertEqual([], self.verificationErrors)
    66
    67 def __generateTestCases():
    68  data = xlrd.open_workbook(u"..\\data\\login_126mail_data.xls")
    69 #通过索引顺序获取Excel表
    70 table = data.sheets()[0]
    71 for args in range(1, table.nrows):
    72  txt = table.row_values(args)
    73  setattr(Login126Mail,‘test_login126mail_%s‘% txt[0],Login126Mail.getTestFunc(*txt))
    74 __generateTestCases()
    75
    76
    77 def test_main():
    78  test_support.run_unittest(Login126Mail)
时间: 2024-12-24 11:46:06

如何使用不同参数组合生成独立的TestCase函数(Python)的相关文章

Python中unittest采用不同的参数组合产生独立的test case

我们在使用Python的unittest做自动化或者单元测试时,有时需要一个测试用例根据不同的输入.输出组合而执行多次,但是,unittest中一个用例只能有一组参数组合执行,如果采用循环的方式,在生成的测试报告中也只会有一个测试用例的统计,单实际上我们需要一组参数就统计为一个测试用例,又或者将用例复制N份(这种方式谁然可以满足需求,单实际上维护太麻烦,如果有一个改动,需要复制N份),那么我们应该采用什么样的办法来实现我们的需求呢?经过查找资料和百度,我们可以采用Python的setattr函数

Python中unittest测试根据不同参数组合产生单独的test case的解决方法

在某种情况下,需要用不同的参数组合测试同样的行为,你希望从test case的执行结果上知道在测试什么,而不是单单得到一个大的 test case:此时如果仅仅写一个test case并用内嵌循环来进行,那么其中一个除了错误,很难从测试结果里边看出来. 问题的关键在于是否有办法根据输入参数的不同组合产生出对应的test case:譬如你有10组数据,那么得到10个test case,当然不适用纯手工的方式写那么多个test_成员函数. 一种可能的思路是不利用unittest.TestCase这个

Python---函数---参数组合

# 参数组合 # 在Python中定义函数,可以用必选参数.默认参数.可变参数.关键字参数和命名关键字参数 # 这5中都可以组合使用 # 参数定义的顺序必须是:必选参数.默认参数.可变参数.命名关键字参数和关键字参数 # 比如定义一个函数,包含上述若干种参数 def f1(a, b, c=0, *args, **kw):     print('a = ', a, 'b = ', b, 'c = ', c, 'args =', args, 'kw =', kw) def f2(a, b, c=0,

基于字典序的组合生成算法

基于字典序的组合生成算法 2010-12-02 01:22:52|  分类: 离散数学 |  标签:离散数学  排列组合   |举报 |字号大中小 订阅 一. 问题描述 给定非空集合A,按字典序的方法生成集合A的所有组合.关于字典序的概念,这里不做严格定义,只是做一简单解释. 字典序是字符串比较的一种方法.例如两个字符串 abcd,abef,这两个字符串谁大? 显然,abef>abcd:如何得出这个结论的呢? 从左至右依次比较每一个字符,首先比较两个串的第一个字符,都是a,相等:其次比较两个串的

排列组合生成算法

r排列生成: gen 递归层数d表示正在生成第d个元素. vis记录是否出现过. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n, r; int A[50], vis[50];//记录第i个元素是否生成过 int cnt; int rer; void output(int r) { for(int i = 0; i < r; i++) printf(

字符串参数组合

字符串参数组合: 方法: public static function substring(str:String, ...rest):String { if (!str) { return ""; } var len:uint = rest.length; var args:Array; if (len == 1 && rest[0] is Array) { args = rest[0] as Array; len = args.length; trace("

函数的参数组合

一. 必选参数:必须传入的参数 二.默认参数:不传入取默认值,传入则覆盖,必须指向不变对象 >>> def my_fun(a,b=[2,]): ... b.append(5) ... print 'a=',a,'b=',b ... >>> my_fun(1) a= 1 b= [2, 5] >>> my_fun(1) a= 1 b= [2, 5, 5] >>> my_fun(1) a= 1 b= [2, 5, 5, 5] >>

XGBoost参数调优完全指南(附Python代码)

XGBoost参数调优完全指南(附Python代码):http://www.2cto.com/kf/201607/528771.html https://www.zhihu.com/question/41354392 [以下转自知乎] https://www.zhihu.com/question/45487317 为什么xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度? 参加kaggle的时候,用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了.但是

【转】XGBoost参数调优完全指南(附Python代码)

xgboost入门非常经典的材料,虽然读起来比较吃力,但是会有很大的帮助: 英文原文链接:https://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-xgboost-with-codes-python/ 原文地址:Complete Guide to Parameter Tuning in XGBoost (with codes in Python) 译注:文内提供的代码和运行结果有一定差异,可以从这里下