自动化测试过程中,自动化覆盖的功能点和对应测试用例之间的关系基本都是1 VS N,如果每次将测试用例一个个单独执行,不仅效率很低,

无法快速反馈测试结果,而且维护起来很麻烦。在python的单元测试框架unittest中,提供了批量执行的测试用例的方法。

这篇博客,介绍下unittest框架的常用类和方法,以及利用discover()方法批量执行测试用例的方法。。。

官方文档:unittest单元测试框架

一、unittest框架

首先介绍一下unittest框架和执行测试用例相关的几个模块:

1、TestCase()类

TestCase类的实例表示unittest中的逻辑测试单元,此类旨在用作基类,具体测试由具体的子类实现。该类实现了测试运行器所需的接口,以允许它驱动测试,

以及测试代码可用于检查和报告各种故障的方法。每个实例都将运行unittest的一个名为methodName的基本方法。

2、setUp()方法

该方法的主要作用是用来初始化测试环境,它在测试用例执行之前立即调用,除了AssertionError或SkipTest,通过该方法产生的任何异常都将被认为是错误的。

只有测试成功执行,才会被调用,默认什么都不做。

3、tearDown()方法

该方法的主要作用是在测试用例执行完毕后记录测试结果并恢复测试环境,即使出现异常,也会调用此方法。

4、run()方法

该方法的作用是运行测试用例,将测试结果收集到TestResult中作为传递的对象。

如果省略结果或者用None创建临时结果对象(通过调用defaultTestResult()方法),结果对象会返回给run()的调用者。

5、defaultTestResult()方法

该方法返回应该用于此测试用例类的测试结果作为实例(如果没有其他结果,实例应返回给run()方法)。

6、TestSuite()类

该类代表单个测试用例和测试套件的集合。它提供了运行测试所需的接口以使其可以像其他测试一样运行。TestSuite实例和遍历套件相同,单独运行每个测试用例。

TestSuite的行为和TestCase非常相似,但它并未实际执行测试,而是用于将测试用例聚合到一起,下面的2个方法用于向TestSuite实例中添加测试用例:

addTest():添加测试用例到TestCase或TestSuite套件中;

addTests():将迭代TestCase和TestSuite实例中的所有测试用例添加到此测试组件,相当于调用addTest()的每个元素。

7、TestLoader()类

所述TestLoader类被用来创建类和模块的测试套件。通常不需要创建该类的实例。unittest框架提供了一个可以共享的实例unittest.defaultTestLoader。

8、discover()方法

discover(start_dir, pattern ='test *.py', top_level_dir = None )

start_dir:要测试的模块名或测试用例目录;

pattern='test*.py':表示用例文件名的匹配原则,下面的例子中匹配文件名为以“test”开头的“.py”文件,星号“*”表示任意多个字符;

top_level_dir=None:测试模块的顶层目录,如果没有顶层目录,默认为None;

该方法通过从指定的开始目录递归到子目录中查找所有测试模块,并返回包含它们的TestSuite对象,只有与模式匹配测试文件和可导入的模块名称才会被加载。

所有测试模块必须可以从项目的顶层导入,如果起始目录不是顶层目录,则顶层目录必须单独指定。

如果一个测试文件的名称符合pattern,将检查该文件是否包含 load_tests() 函数,如果 load_tests() 函数存在,则由该函数负责加载本文件中的测试用例。

如果不存在,就会执行loadTestsFromModule(),查找该文件中派生自TestCase 的类包含的 test 开头的方法。

9、TestResult()类

该类用于记录哪些测试成功或失败的信息。一个TestResult对象存储一组测试的结果,在TestCase和TestSuite中保证结果正确记录。

测试框架unittest需要访问TestResult作为报告目的运行一组测试所生成的对象,为此目的TestResult和TestRunner.run()方法返回一个实例 。

二、addTest()实例

举个例子来说,如果测试用例有下面这些:

使用addTest()方法执行测试用例,示例代码如下:

# coding=utf-8
import unittest # 加载测试用例
import test_user
import test_mobile
import test_mobcode
import test_txtcode
import test_pwd
import test_signup
import test_login
import test_vipcenter
import test_search # 将测试用例添加到测试集合
suite = unittest.TestSuite()
suite.addTest(test_user.UserTest("test_user")) # 用户名
suite.addTest(test_mobile.MobileTest("test_mobile")) # 手机号码
suite.addTest(test_mobcode.MobCodeTest("test_mobcode")) # 手机验证码
suite.addTest(test_txtcode.TxtCodeTest("test_txtcode")) # 图形验证码
suite.addTest(test_pwd.PasswordTest("test_pwd")) # 密码
suite.addTest(test_signup.SignUpTest("test_signup")) # 注册功能
suite.addTest(test_login.LoginTest("test_loggin")) # 登录功能
suite.addTest(test_vipcenter.VipTest("test_vip")) # 会员中心
suite.addTest(test_search.SearchTest("test_search")) # 搜索功能 # 运行测试用例
runner = unittest.TextTestRunner()
runner.run(suite)

可以看出需要进行很多的用例导入和添加操作,如果用例成百上千条,那么这将是一场灾难!!!

三、discover()使用实例

还是上面的那些测试用例,这次使用discover()方法批量执行用例,示例代码如下:

# coding=utf-8
import unittest
from unittest import defaultTestLoader # 测试用例存放路径
case_path = './Testcase/case' # 获取所有测试用例
def get_allcase():
discover = unittest.defaultTestLoader.discover(case_path, pattern="test*.py")
suite = unittest.TestSuite()
suite.addTest(discover)
return suite if __name__ == '__main__':
# 运行测试用例
runner = unittest.TextTestRunner()
runner.run(get_allcase())

相比于addTest()方法,discover()方法更方便高效,也可以提高测试反馈速率。

PS:使用discover()方法,切记测试用例中需要执行的测试方法必须以test开头,否则无法加载!!!

以上就是关于unittest框架的一些常用类和方法的介绍,以及批量执行测试用例的2种方法,仅供参考。。。

python:unittest之discover()方法批量执行用例的更多相关文章

  1. unittest的discover方法批量执行02

    前言 我们在写用例的时候,单个脚本的用例好执行,那么多个脚本的时候,如何批量执行呢?这时候就需要用到unittet里面的discover方法来加载用例了. 加载用例后,用unittest里面的Text ...

  2. python接口自动化(二十六)--批量执行用例 discover(详解)

    简介 我们在写用例的时候,单个脚本的用例好执行,那么多个脚本的时候,如何批量执行呢?这时候就需要用到 unittest 里面的 discover 方法来加载用例了.加载用例后,用 unittest 里 ...

  3. Python 中使用 ddt 来进行数据驱动,批量执行用例,修改ddt代码

    1. 什么是数据驱动? 使用数据驱动有什么好处? 用例执行是靠数据来驱动的,每条测试用例除了测试数据不一样意外,所有的用例代码都是一样的,为了使用例批量执行,我们会使用数据驱动的思想来批量执行测试用例 ...

  4. python自动化-unittest批量执行用例(discover)

    前言 我们在写用例的时候,单个脚本的用例好执行,那么多个脚本的时候,如何批量执行呢?这时候就需要用到unittet里面的discover方法来加载用例了. 加载用例后,用unittest里面的Text ...

  5. Python unittest discover()方法与执行顺序补充

    一.discover更多测试用例 可以根据不同的功能创建不同的测试文件,甚至是不同的测试目录,测试文件中还可以将不同的小功能划分为不同的测试类,在类下编写测试用例,让整体结构更加清晰 但通过addTe ...

  6. unittest详解(四) 批量执行用例(discover)

    前面我们说了,对于不同文件用例,我们可以通过addTest()把用例加载到一个测试套件(TestSuite)来统一执行,对于少量的文件这样做没问题,但是如果有几十上百个用例文件,这样做就太浪费时间了. ...

  7. unittest(discover 批量执行用例)

    import unittest dir = "D:\\work_doc\\pycharm2\\python_Basics" #自动化用例所存放的路径 suit = unittest ...

  8. Python----unittest discover()方法与执行顺序

    一.Unittest discover()可以根据不同的功能创建不同的测试文件,甚至是不同的测试目录,测试文件中还可以将不同的小功能划分为不同的测试类,在类下编写测试用例,让整体结构更加清晰一般是通过 ...

  9. 使用discover批量执行用例

    TestLaoder 该类负责根据各种条件加载测试用例,并将它们返回给测试套件,正常情况下,不需要创建这个类的实例,unittest提供了可以共享的defaultTestLoader类,可以使用其子类 ...

随机推荐

  1. 2018-09-24 Java源码英翻中网页演示

    在线演示地址: 源代码翻译 两部分如下. 独立的Java代码翻译库 续前文代码翻译尝试-使用Roaster解析和生成Java源码 源码库: program-in-chinese/java_code_t ...

  2. Mac上Homebrew的安装

    Mac系统版本: 10.14.2 下载brew_install 访问:https://raw.githubusercontent.com/Homebrew/install/master/install ...

  3. 2.Odoo产品分析 (一) – 一切为零

    查看Odoo产品分析系列--目录 1. 默认数据库 声明在先  本系列文档(Odoo产品分析)整理来自本人对该ERP的理解,并结合文档Working-with-Odoo-10-Second-Editi ...

  4. NoHttp封装--07 自定义异步任务框架

    MainActivity: public class MainActivity extends Activity implements View.OnClickListener { .... @Ove ...

  5. 关于在ROS kinetic下arbotix报错的问题

    最近在学习ros过程中 出现了一个包错误  ERROR:cannot launch node of type [arbotix_python/arbotix_driver]:arbotix_pytho ...

  6. coTurn 运行在Windows平台的方法及服务与客户端运行交互流程和原理

    coTurn是一个开源的STUN和TURN及ICE服务项目,只是不支持Windows.为了在window平台上使用coTurn源码,需要在windows平台下安装Cygwin环境,并编译coTurn源 ...

  7. sqlserver——cube:多维数据集

    1.cube:生成多维数据集,包含各维度可能组合的交叉表格,使用with 关键字连接 with cube 根据需要使用union all 拼接 判断 某一列的null值来自源数据还是 cube 使用G ...

  8. 洗礼灵魂,修炼python(71)--爬虫篇—【转载】xpath/lxml模块,爬虫精髓讲解

    Xpath,lxml模块用法 转载的原因和前面的一样,我写的没别人写的好,所以我也不浪费时间了,直接转载这位崔庆才大佬的 原帖链接:传送门 以下为转载内容: --------------------- ...

  9. NUMA导致的Oracle性能问题

    背景简介: Oracle版本:11.2.0.4 OS 版本:OEL5.8 在一次Oracle的Dataguard正常switchover过程中,遇到了一个极其诡异的问题,一条主业务的SQL语句在新主库 ...

  10. element-ui 2.4.8 BUG 标签页的最后一个Tab标题没法移除,更新后发现最新版本不存在该问题了 记录下