Unittest加载执行用例的方法总结
前言
说到测试框架,unittest是我最先接触的自动化测试框架之一了, 而且也是用的时间最长的, unittest框架有很多方法加载用例,让我们针对不同的项目,不同项目的大小及用例的多少自己选择加载方式。今天我们就简单的说说几种加载方式。
方式1
简单的实例
import unittest
class LoadTest(unittest.TestCase):
def test_case_01(self):
self.assertEqual(1, 1)
def test_case_02(self):
self.assertEqual(2, 1)
if __name__ == '__main__':
suit = unittest.TestSuite()
suit.addTest(LoadTest('test_case_01'))
suit.addTest(LoadTest('test_case_02'))
runner = unittest.TextTestRunner()
runner.run(suit)
# 输出
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
Process finished with exit code 0
说明
首先我们需要创建一个测试套件suite,其次通过addTest方法添加用例,addTest的参数为单个用例, 比如实例中记载的是LoadTest测试类中的test_case_01 和 02, 我们就按照上述方式传递参数。如果加载运行用例的代码在另一个文件中,我们需要在此文件中导入测试类。
方式2
简单实例
import unittest
class LoadTest(unittest.TestCase):
def test_case_01(self):
self.assertEqual(1, 1)
def test_case_02(self):
self.assertEqual(2, 2)
if __name__ == '__main__':
suit = unittest.TestSuite()
case_list = [LoadTest('test_case_01'), LoadTest('test_case_02')]
suit.addTests(case_list)
runner = unittest.TextTestRunner()
runner.run(suit)
# 输出
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
Process finished with exit code 0
说明
方式2是通过同样的原理加载测试用例的,只不过是一次性加载多个,不需要多次调用addTest方法,我们只需要调用一次addTests方法,加载一个用例组成的序列,相比较而言,第二种比第一种稍微方便那么一点
方式3
简单实例
import unittest
class LoadTest(unittest.TestCase):
def test_case_01(self):
self.assertEqual(1, 1)
def test_case_02(self):
self.assertEqual(2, 2)
if __name__ == '__main__':
suit = unittest.TestSuite() # 测试套件
loader = unittest.TestLoader() # 用例加载器
test_class = loader.loadTestsFromTestCase(LoadTest) # 加载测试类
suit.addTest(test_class) # 测试类添加到测试套件中
runner = unittest.TextTestRunner() # 用例运行器
runner.run(suit) # 运行
# 输出
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
Process finished with exit code 0
说明
实例是通过创建一个加载器来加载测试用例,可以看到加载器需要加载一个测试类, 不需要像前两个方式那样,一个一个加载测试用例,但是如果一个模块中有多个测试类的情况,我们仍然需要编写多条加载代码 test_class = loader.loadTestsFromTestCase(LoadTest) # 加载测试类
方式4
简单实例
import unittest
class LoadTest(unittest.TestCase):
def test_case_01(self):
self.assertEqual(1, 1)
def test_case_02(self):
self.assertEqual(2, 2)
if __name__ == '__main__':
pass
import unittest
import sys
sys.path.append('.')
import unittest_tc_load if __name__ == '__main__':
suit = unittest.TestSuite() # 测试套件
loader = unittest.TestLoader() # 用例加载器
test_module = loader.loadTestsFromModule(unittest_tc_load) # 加载测试类
suit.addTest(test_module) # 测试类添加到测试套件中
runner = unittest.TextTestRunner() # 用例运行器
runner.run(suit) # 运行
说明
这个方式其实是和方式3一样的原理, 只不过这个方式是直接加载整个测试模块, 如果测试模块中含有多个测试类,都将被加载,这样批量添加测试会很方便,前提是我们需要导入我们测试模块
方式5
说明
方式5是直接通过在创建测试套件的时候直接把测试模块添加到测试套件中,看下面的代码
loader = unittest.TestLoader() # 用例加载器
test_modules = (loader.loadTestsFromModule(unittest_tc_load1), loader.loadTestsFromModule(unittest_tc_load2)) # 加载测试类
suit = unittest.TestSuite(tests=test_modules) # 测试套件
runner = unittest.TextTestRunner() # 用例运行器
runner.run(suit) # 运
unittest_tc_load1和unittest_tc_load2为两个测试模块,我们使用这种方式的时候需要先导入这两个模块
方式6
简单实例
import unittest
class LoadTest(unittest.TestCase):
def test_case_01(self):
self.assertEqual(1, 1)
def test_case_02(self):
self.assertEqual(2, 2)
if __name__ == '__main__':
suite = unittest.makeSuite(LoadTest)
runner = unittest.TextTestRunner()
runner.run(suite)
# 输出
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
Process finished with exit code 0
说明
方式6的方法同样只能加载一个测试类,但是相比前面几种方法,代码少了很多,同样,如果运行多个测试类仍然需要创建多个suite
方式7
简单实例
import unittest
class LoadTest(unittest.TestCase):
def test_case_01(self):
self.assertEqual(1, 1)
def test_case_02(self):
self.assertEqual(2, 2)
if __name__ == '__main__':
discover = unittest.defaultTestLoader.discover(start_dir='.', pattern='unittest*.py')
runner = unittest.TextTestRunner()
runner.run(discover)
# 输出
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
Process finished with exit code 0
说明
方式7通过defaultTestLoader.discover()方法来发现用例,我们可以看到第一个参数start_dir 表示用例的目录, pattern 表示匹配什么样的文件搜索测试用例,比较上面几种方法,个人认为这种方法是最灵活的,我们可以通过规范测试模块文件的命名,使用这种方式一次性加载所有的用例
总结
大概方法差不多就这些,其实还有很多其他加载方法, 比如通过TestLoader方法加载用例,我们可以看到他其他加载用例的方法。

最后呢还是需要根据个人实际中的一个需求选择不同的方法, 正确的方法往往会事半功倍。
Unittest加载执行用例的方法总结的更多相关文章
- windows 下加载执行hta文件的方法
首先编写这么一个hta的文件: <html> <head> <script> s = new ActiveXObject("WScript.Shell&q ...
- 【Spring源码分析】非懒加载的单例Bean初始化过程(上篇)
代码入口 上文[Spring源码分析]Bean加载流程概览,比较详细地分析了Spring上下文加载的代码入口,并且在AbstractApplicationContext的refresh方法中,点出了f ...
- 【Spring源码分析】非懒加载的单例Bean初始化过程(下篇)
doCreateBean方法 上文[Spring源码分析]非懒加载的单例Bean初始化过程(上篇),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下 ...
- 【Spring源码分析】非懒加载的单例Bean初始化前后的一些操作
前言 之前两篇文章[Spring源码分析]非懒加载的单例Bean初始化过程(上篇)和[Spring源码分析]非懒加载的单例Bean初始化过程(下篇)比较详细地分析了非懒加载的单例Bean的初始化过程, ...
- Spring源码分析:非懒加载的单例Bean初始化前后的一些操作
之前两篇文章Spring源码分析:非懒加载的单例Bean初始化过程(上)和Spring源码分析:非懒加载的单例Bean初始化过程(下)比较详细地分析了非懒加载的单例Bean的初始化过程,整个流程始于A ...
- Spring源码分析:非懒加载的单例Bean初始化过程(下)
上文Spring源码分析:非懒加载的单例Bean初始化过程(上),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下AbstractAutowireC ...
- Spring源码分析:非懒加载的单例Bean初始化过程(上)
上文[Spring源码分析]Bean加载流程概览,比较详细地分析了Spring上下文加载的代码入口,并且在AbstractApplicationContext的refresh方法中,点出了finish ...
- js 动态加载事件的几种方法总结
本篇文章主要是对js 动态加载事件的几种方法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 有些时候需要动态加载javascript事件的一些方法往往我们需要在 JS 中动态添 ...
- Java的cmd配置(也即Java的JDK配置及相关常用命令)——找不到或无法加载主类 的解决方法
Java的cmd配置(也即Java的JDK配置及相关常用命令) ——找不到或无法加载主类 的解决方法 这段时间一直纠结于cmd下Java无法编译运行的问题.主要问题描述如下: javac 命令可以正 ...
随机推荐
- LeetCode 824. Goat Latin (山羊拉丁文)
题目标签:String 首先把vowel letters 保存入 HashSet. 然后把S 拆分成 各个 word,遍历每一个 word: 当 word 第一个 字母不是 vowel 的时候,把第一 ...
- 递归,迭代,堆栈三种方式实现单链表反转(C++)
#author by changingivan# 2016.04.12#include <iostream> #include <stack> using namespace ...
- bzoj3332: 旧试题
这题就是最大生成树. 把两个点之间的期望建边排序. 把相同的期望一起做,那么在这个做之前,这些有着相同期望的点两两肯定不连,否则就输出No了. 相同的做完之后,再次for一遍check一下有没有两两之 ...
- 自然常数 e 的理解与应用
某彩票中奖率是百万分之一,则一个人买一百万张彩票仍不中奖的概率是: (1−1106)106≈1e e 往往出现在: 许多微小事件带来的总体变化 随机性和无穷多:
- B1826 [JSOI2010]缓存交换 贪心+离散化+堆
这个题仔细一想可以直接贪心做,因为队列里下一个出现的早的一定最优.正确性显然.然后我只拿了50,我直接模拟另一个队列暴力修改最后一个点的nxt值,自然会T.但是其实不用修改,直接插入就行了前面的不影响 ...
- SPOJ - QMAX3VN (4350) splay
SPOJ - QMAX3VN 一个动态的序列 ,在线询问某个区间的最大值.关于静态序列的区间最值问题,用ST表解决,参考POJ 3264 乍一看上去 splay可以轻松解决.书上说可以用块状链表解决, ...
- java动态代理实例
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflec ...
- Hadoop - WordCount代码示例
文章来源:http://www.itnose.net/detail/6197823.html import java.io.IOException; import java.util.Iterator ...
- H5 触摸事件
HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事件主 ...
- Tornado异步模式
先介绍下背景:由于工作需要,前段时间又写了一段爬虫去获取和更新一些数据.之前爬虫主要用Scrapy框架批量爬取一些页面数据,或者用Gevent调用目标站点的接口.偶然看到了Tornado,听说这个框架 ...