在使用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.  # -*- 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)

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

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

    我们在使用Python的unittest做自动化或者单元测试时,有时需要一个测试用例根据不同的输入.输出组合而执行多次,但是,unittest中一个用例只能有一组参数组合执行,如果采用循环的方式,在生 ...

  2. 【原创】开源.NET排列组合组件KwCombinatorics使用(一)—组合生成

           本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1. ...

  3. aardio + Python 可视化快速开发桌面程序,一键生成独立 EXE

    网络上大家分享的 aardio + Python 混合开发的文章很多,不得不说 aardio 与 Python 混合开发是真的简单 !  快速入门 推荐几个快速上手教程:< aardio + P ...

  4. Python—函数的参数组合

    参数组合 在Python中定义函数,可以用必选参数.默认参数.可变参数.关键字参数和命名关键字参数,这5种参数都可以组合使用.但是请注意,参数定义的顺序必须是:必选参数.默认参数.可变参数.命名关键字 ...

  5. 帆软报表(finereport)参数组合/下拉参数联动

    首先实现下拉参数联动 1.参数的定义→添加控件绑定数据→参数过滤和参数面板样式 下拉复选框控件注意事项:select * from tablewhere 1=1${if(len(控件名称)=0,&qu ...

  6. Linux Ubuntu下用Android NDK 生成独立交叉编译链

    本文主要介绍使用Android NDK生成独立交叉编译链,然后使用独立交叉编译链编译Android程序 下载NDK 下载与自己操作系统相吻合的版本 下载地址 解压到安装目录(如~/myndk): ta ...

  7. 消除运行MATLAB生成独立可执行程序的DOS黑屏

    基于Matlab生成独立可执行文件后,每次运行都存在DOS黑屏问题,可通过以下方法解决: 在Matlab命令窗口中输入: cd(prefdir) edit compopts.bat 在打开的文件最后添 ...

  8. excel如何将一个工作薄中的工作表生成独立的工作薄

    excel如何将一个工作薄中的工作表生成独立的工作薄  '用vba代码 Sub 另存所有工作表为工作簿() Dim sht As Worksheet Application.ScreenUpdatin ...

  9. python基础 — 参数组合

    参数组合 >>>def f1(a, b, c=0, *args, **kw): ... print('a =', a, 'b =', b, 'c =', c, 'args =', a ...

随机推荐

  1. 使用sql对数据库进行简单的增删改查

    1.创建表 create table 表名( 列名  列的类型, 列名  列的类型, 列名  列的类型 (注意自后一列不能加‘ ,’) ); 2.修改表 修改表名--> rename 旧表名 t ...

  2. Mysql索引介绍及常见索引(主键索引、唯一索引、普通索引、全文索引、组合索引)的区别

    Mysql索引概念:说说Mysql索引,看到一个很少比如:索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不是越多越好,假如这本书1000页,有500也是目录,它当然效率低,目录是要 ...

  3. Uploadify在MVC中使用方法案例(上传单张图片)

    在View视图中: <link href="/Scripts/uploadify-v3.2.1/uploadify.css" rel="stylesheet&quo ...

  4. java socket 发送文件

    客户端: package tt; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStrea ...

  5. linux中的一个看图的软件

    毕竟才是初入linux,很多工具,先要要求有个用着,之后再要求小巧强大好用. 看图软件,不喜欢kde或者是gnome这种庞大的桌面环境,也就不喜欢一些跟特定桌面环境沾边的软件(总觉得用软件必须要用特定 ...

  6. 「ruby/MiniMagick」用MiniMagick处理图片

    包的选择和配置 想用RMagick,但据说内存泄露的问题比较厉害,作为替代品MiniMagick不存在内存泄露的问题.而二者都是使用ImageMagick的,所以需要下载并安装ImageMagick. ...

  7. 【fedora】强制解除yum锁定

    运行yum makecache时出现yum update时候出现Another app is currently holding the yum lock解决方法yum被锁定了. 可以通过执行 rm ...

  8. wc移植sae笔记

    1.wc移植到sae---上传图片 ①先看profile.ptl.html中的ajax代码修改functions.js中G_BASE_URL的值.在这里我先写死成->'http://2.idan ...

  9. redis面试题总结

    1. 使用redis有哪些好处? (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) (2) 支持丰富数据类型,支持string,li ...

  10. java的servlet初步学习

    目录 1.servelet概念作用理解 ====来源于孤傲苍狼  http://www.cnblogs.com/xdp-gacl/p/3760336.html======= 2.servlet的运行过 ...