python:unittest之discover()方法批量执行用例

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

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

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

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

 

1、unittest框架单元测试

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

一、TestCase()类ui

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

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

 

二、setUp()方法code

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

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

 

三、tearDown()方法

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

 

四、run()方法

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

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

 

五、defaultTestResult()方法

该方法返回应该用于此测试用例类的测试结果做为实例(若是没有其余结果,实例应返回给run()方法)。

 

六、TestSuite()类

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

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

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

addTests():将迭代TestCase和TestSuite实例中的全部测试用例添加到此测试组件,至关于调用addTest()的每一个元素。

 

七、TestLoader()类

所述TestLoader类被用来建立类和模块的测试套件。一般不须要建立该类的实例。unittest框架提供了一个能够共享的实例unittest.defaultTestLoader。

 

八、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 开头的方法。

 

九、TestResult()类

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

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

 

2、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)

能够看出须要进行不少的用例导入和添加操做,若是用例成百上千条,那么这将是一场灾难!!!

 

3、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种方法,仅供参考。。。

相关文章
相关标签/搜索