在某种情况下,需要用不同的参数组合测试同样的行为,你希望从test case的执行结果上知道在测试什么,而不是单单得到一个大的 test case;此时如果仅仅写一个test case并用内嵌循环来进行,那么其中一个除了错误,很难从测试结果里边看出来。

问题的关键在于是否有办法根据输入参数的不同组合产生出对应的test case;譬如你有10组数据,那么得到10个test case,当然不适用纯手工的方式写那么多个test_成员函数。

一种可能的思路是不利用unittest.TestCase这个类框中的test_成员函数的方法,而是自己写runTest这个成员函数,那样会有一些额外的工作,而且看起来不是那么“智能”。那该如何让框架自动调用testcase呢?

我们的思路是:

  • 利用setattr来自动为已有的TestCase类添加成员函数
  • 为了使这个方法凑效,需要用类的static method来生成decorate类的成员函数,并使该函数返回一个test函数对象出去
  • 在某个地方注册这个添加test成员函数的调用(只需要在实际执行前就可以,可以放在模块中自动执行亦可以手动调用)

代码实例:

import unittest

from test import test_support

class MyTestCase(unittest.TestCase):

def setUp(self):

#some setup code

pass

def clear(self):

#some cleanup code

pass

def action(self, arg1, arg2):

pass

@staticmethod

def getTestFunc(arg1, arg2):

def func(self):

self.action(arg1, arg2)

return func

def __generateTestCases():

arglists = [('arg11', 'arg12'), ('arg21', 'arg22'), ('arg31', 'arg32')]

for args in arglists:

setattr(MyTestCase, 'test_func_%s_%s'%(args[0], args[1]),

MyTestCase.getTestFunc(*args) )

__generateTestCases()

if __name__ =='__main__':

#test_support.run_unittest(MyTestCase)

unittest.main()

案例如下

#一个用例,多个结果# -*- coding: utf-8 -*-

import timefrom selenium import webdriverfrom selenium.webdriver.support.select import Selectimport unittestfrom public import config

class TestPurchase(unittest.TestCase):    u"""购物车哦"""    def setUp(self):        # self.driver = webdriver.Firefox()        # self.driver = webdriver.Ie()        self.driver = webdriver.Chrome()        self.driver.maximize_window()        self.driver.implicitly_wait(30)        self.base_url = "https://store.wondershare.com/?submod=checkout&method=index&pid=542&license_id=60&sub_lid=4824&currency=USD&verify=888af7270adb2a46faa26509db54d979"        self.verificationErrors = []        self.accept_next_alert = True        self.driver.get(self.base_url)

    def tearDown(self):        now = time.strftime('%H_%M_%S',time.localtime(time.time()))        self.driver.save_screenshot(""+config.screenshotpath+"\\StoreForCom"+now+".jpg")        self.driver.quit()        self.assertEqual([],self.verificationErrors)

    def purchaes_payment(self,phone,carnum):        u"""Payment支付"""        driver = self.driver        driver.find_element_by_xpath(".//*[@id='tack_button']").click()        selcurrency = driver.find_element_by_xpath(".//*[@id='currency']")        Select(selcurrency).select_by_value("EUR")        driver.find_element_by_xpath(".//*[@id='content']/div/table/tbody/tr[2]/td[5]/a[2]").click()        driver.find_element_by_xpath(".//*[@id='zipcode']").clear()        driver.find_element_by_xpath(".//*[@id='zipcode']").send_keys("zip")        # driver.find_element_by_xpath(".//*[@id='phone']").clear()        # driver.find_element_by_xpath(".//*[@id='phone']").send_keys(phone)        selcountry = driver.find_element_by_xpath(".//*[@id='country']")        Select(selcountry).select_by_value("us")        selcity = driver.find_element_by_xpath(".//*[@id='state_list']")        Select(selcity).select_by_value("New York")        driver.find_element_by_xpath(".//*[@id='email']").clear()        driver.find_element_by_xpath(".//*[@id='email']").send_keys("jiangyf@wondershare.cn")        driver.find_element_by_xpath(".//*[@id='ccnumber']").clear()        driver.find_element_by_xpath(".//*[@id='ccnumber']").send_keys(carnum)        selmonth = driver.find_element_by_xpath(".//*[@id='ccexpmonth']")        Select(selmonth).select_by_value("12")        selyear = driver.find_element_by_xpath(".//*[@id='ccexpyear']")        Select(selyear).select_by_value("2026")        driver.find_element_by_xpath(".//*[@id='cvv']").clear()        driver.find_element_by_xpath(".//*[@id='cvv']").send_keys("123")        driver.find_element_by_xpath(".//*[@id='nameoncard']").clear()        driver.find_element_by_xpath(".//*[@id='nameoncard']").send_keys("John")        driver.find_element_by_xpath(".//*[@id='check']").click()        text = driver.find_element_by_xpath("html/body/div[3]/div/div[1]/div[1]").text        self.assertEqual(text,"Thank You For Your Order!",u"支付失败")

    @staticmethod    def getTestFunc(phone, carnum):        def func(self):            self.purchaes_payment(phone, carnum)        return func

def __generateTestCases():    arglists = [('123456789', '5111111111111111'), ('987654321', '5555555555554444')]    for args in arglists:        setattr(TestPurchase, 'test_func_%s_%s'%(args[0], args[1]),        TestPurchase.getTestFunc(*args) )__generateTestCases()

if __name__ == '__main__':    unittest.main()

python一个用例,多组参数,多个结果的更多相关文章

  1. 定义一个方法get_page(url),url参数是需要获取网页内容的网址,返回网页的内容。提示(可以了解python的urllib模块)

    定义一个方法get_page(url),url参数是需要获取网页内容的网址,返回网页的内容.提示(可以了解python的urllib模块) import urllib.request def get_ ...

  2. 使用robotframework做接口测试5——一个用例中调多个接口

    凡是涉及一点点有接口关联的,都可能下一个接口需要上一个接口的某个返回值作为入参,最直接的例子,就是登录依赖.用接口做业务性的测试,也绝对离不开接口依赖的,业务都是一系列接口串联的结果,有时候一个接口操 ...

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

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

  4. Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数

    Python第七天   函数  函数参数   函数里的变量   函数返回值  多类型传值     函数递归调用   匿名函数   内置函数 目录 Pycharm使用技巧(转载) Python第一天   ...

  5. Python学习札记(十三) Function3 函数参数二

    参考:函数参数 Note A.关键字参数: 1.关键字参数:**kw 可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple.而关键字参数允许你传入0个或任意个含参数名的 ...

  6. Python学习手册之捕获组和特殊匹配字符串

    在上一篇文章中,我们介绍了 Python 的字符类和对元字符进行了深入讲解,现在我们介绍 Python 的捕获组和特殊匹配字符串.查看上一篇文章请点击:https://www.cnblogs.com/ ...

  7. RocketMQ一个新的消费组初次启动时从何处开始消费呢?

    目录 1.抛出问题 1.1 环境准备 1.2 消息发送者代码 1.3 消费端验证代码 2.探究CONSUME_FROM_MAX_OFFSET实现原理 2.1 CONSUME_FROM_LAST_OFF ...

  8. Python基本语法_函数属性 & 参数类型 & 偏函数的应用

    目录 目录 前言 软件环境 Python Module的程序入口 函数的属性 Python函数的创建 函数的参数 必备参数 缺省参数 命名参数 不定长参数 匿名参数 偏函数的应用 前言 Python除 ...

  9. python学习7—函数定义、参数、递归、作用域、匿名函数以及函数式编程

    python学习7—函数定义.参数.递归.作用域.匿名函数以及函数式编程 1. 函数定义 def test(x) # discription y = 2 * x return y 返回一个值,则返回原 ...

随机推荐

  1. tmux 简单介绍

    不定期更新. 虽然一直很抵制使用linux,尤其是服务器那种无界面的东东,但是没办法还是得用.平时连接上服务器后每次要执行一个新的命令都得开一个新窗口重新连接服务器,不仅麻烦,而且有的时候服务器或者我 ...

  2. CentOS 7 安装配置 MySQL

    https://blog.imzhengfei.com/centos-7-an-zhuang-pei-zhi-mysql/ MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前 ...

  3. jQuery实现回车绑定Tab事件

    有时候我们希望回车事件绑定的是键盘的Tab事件.我的第一思路就是切换事件的keyCode,比如键盘事件按下的keyCode如果是13,我们将keyCode改为9.但是在实际编程中却未能实现此效果.于是 ...

  4. 关于dubbo服务超时的讨论

    呵呵,偷点懒,直接把QQ上的讨论发下来. huxin  10:35:19你们现在超时了是咋办的,首先超时了,回复用户肯定是要的 huxin  10:36:14超时了用户实际是不知道这业务是成功还失败了 ...

  5. $Django 多对多-自定义第三张表 基于双下划线的跨表查询(补充)

    自定义第三张表的好处:可以定义多个字段, 缺点:查询不方便(有方法解决) 1.第三张表设置外键,联合唯一(查询不方便) class Books(models.Model): name=models.C ...

  6. 转载:UML学习(一)-----用例图 (silent)

    原文:http://www.cnblogs.com/silent2012/archive/2011/09/07/2169518.html 1.什么是用例图 用例图源于Jacobson的OOSE方法,用 ...

  7. Maven多模块项目加载

      Maven多模块项目中如何让Spring运行时成功加载指定的子模块   将子模块pom加入到父模块pom的定义中,并继承父模块   在web.xml中配置加载子模块的Spring配置文件   在启 ...

  8. python相关的安装软件

    本次安装的系统是WINDOWS系统 一.python3.anaconda和python2 1.准备工具:python3.python2安装包可以直接从官网下载https://www.python.or ...

  9. 将list集合转json

    public static class DataHelper { /// /// js 序列化器 /// static JavaScriptSerializer jss = new JavaScrip ...

  10. liunx contos 7.4 安装redis集群

    前前后后安装了几次redis集群,基本上每次安装都会采坑,耗时伤神. 安装redis依赖gcc环境,安装前先检查liunx上面有没有安装GCC 命令:gcc -v 上传redis-4.0.1.tar. ...