unittest框架系列一(unittest初识)

想了很久还是打算就unittest测试框架做一个系列的分析,unittest是我接触的最早的一款python的测试框架,希望对于以前的一些东西的一些回顾,和对新特性的学习能够帮助新手更快的入门。本篇unittest系列文章会结合最新的unittest官方文档,包含老的特性的同时,讲解一些新的特性,unittest框架虽然是基础的python测试框架,在测试颗粒度、第三方测试插件支持等方面较pytest要弱,但是在测试工作中仍然在广泛的使用,也是一名自动化测试工程师必学的框架之一。

欢迎加入测试交流群:夜行者自动化测试(816489363)进行交流学习QAQ

                                                                                                                        –成都-阿木木

软件测试常用测试框架:

java:junit

java:testng

python:unittest

python:pytest

unittest支持测试自动化,共享测试的设置和关闭代码,将测试聚合到集合中以及测试与报告框架的独立性。该unittest模块提供的类可轻松支持一组测试的这些质量。

使用unittest之前,先了解unittest的一些重要概念:

test fixture:

​ Test Fixture用在测试方法前,或者测试方法后,主要功能是提供一些测试需要用的装置,这些装置可以是数据,可以是环境配置也可以是一个运行前状态。简单说,就是数据初始化,以及数据销毁,使用内置的setup/teardown/setUpClass/tradDownClass。

test case:

​ 测试用例是测试的最小单位。它检查对一组特定输入的特定响应。 unittest提供了一个基类, TestCase可用于创建新的测试用例。即创建对应你测试用例的脚本。

test suite:

​ 一个测试套件是测试用例,测试套件,或两者的集合。它用于汇总应一起执行的测试。即测试套件之间可以嵌套,也可以只有一个测试套件,在套件中包含测试用例。

test runner :

​ 测试运行是编排的测试的执行,并提供结果给用户的部件。也就是相当于,框架的入口,他会收集脚本,执行脚本,输出结果。

通过TestCaseFunctionTestCase类支持测试用例和测试夹具概念 。在创建新测试时应使用前者,而在将现有测试代码与 unittest驱动框架集成时可以使用后者。FunctionTestCase会放在后面作为高级的一部分给大家进行分享讲解,在实际工作中通常也只会用到TestCase。

测试套件由TestSuite类实现。此类允许单个测试和测试套件的聚合;执行套件时,将运行直接添加到套件和子测试套件中的所有测试。

测试运行程序是提供单个方法的对象,该方法 run()接受TestCaseTestSuite 对象作为参数,并返回结果对象。TestResult提供该类 以用作结果对象。unittest 提供了TextTestRunner一个示例测试运行器,该运行器默认情况下报告标准错误流上的测试结果。

#!/user/bin/env python# -*- coding: utf-8 -*-"""

------------------------------------

@Project : mysite

@Time    : 2020/8/28 11:32

@Auth    : chineseluo

@Email  : 848257135@qq.com

@File    : unittest_demo.py

@IDE    : PyCharm

------------------------------------

"""importunittest# 继承unittest.TestCaseclassTestStringMethods(unittest.TestCase):# 每一个测试方法以test开头,才可以被runner扫描到deftest_upper(self):self.assertEqual('foo'.upper(),'FOO')deftest_isupper(self):self.assertTrue('FOO'.isupper())self.assertFalse('Foo'.isupper())deftest_split(self):s='hello world'# 检查分割后的字符串是否相等,比较的s.split()这个分割后的列表与['hello', 'world']是否相等self.assertEqual(s.split(),['hello','world'])# 断言是否会抛出TypeError异常withself.assertRaises(TypeError):s.split(2)if__name__=='__main__':unittest.main()

​ 通过子类创建测试用例unittest.TestCase。这三个单独的测试使用名称以字母开头的方法定义 test。该命名约定将告知runner那些测试方法能够被扫描到。

​ 每个测试要求assertEqual()检查预期结果。assertTrue()assertFalse() 验证条件;或assertRaises()验证是否引发了特定的异常。使用这些方法代替 assert语句,因此测试运行程序可以累积所有测试结果并生成报告。

​ 该setUp()tearDown()方法允许你定义将在每次测试方法之后执行的指令。在组织测试代码部分中将更详细地介绍它们。

运行测试用例的几种方式:

1、粗粒度的运行,运行该py文件先继承unittest.TestCase的所有测试类中的所有测试方法。

unittest.main()

2、细粒度的运行(后面有部分会补充说明)

loadTestsFromTestCase(testCaseClass):按测试用例

loadTestsFromModule(module, pattern=None):按测试模块不在维护

loadTestsFromName(name, module=None):按测试方法名,name是一个string,name格式module.class.method

loadTestsFromNames(name, module=None):按测试方法名列表,names是一个list,用法与上同

discover(start_dir, pattern=’test*.py’, top_level_dir=None):自动扫描目录,按照匹配规则匹配测试文件,执行测试

suite=unittest.TestLoader().loadTestsFromTestCase(TestStringMethods)unittest.TextTestRunner(verbosity=2).run(suite)

3、命令行界面运行

以模块为单位来运行测试用例:

python -m unittest test_module1

python -m unittest test_module1 test_module2

以测试类为单位来运行测试用例:python -m unittest test_module.TestClass

以测试方法为单位来运行测试用例:

运行一个测试类中的一个方法python -m unittest test_module.TestClass.test_method

运行一个测试类中的多个方法python -m unittest unittest_demo.TestStringMethods.test_split unittest_demo.TestStringMethods.test_isupper

可以通过测试路径来进行测试模块的执行:python.exe -m unittest path/to/test_file.py

可以增加 -v 参数获取更详细的输出。

例:python -m unittest -v test_module1

用于命令行选项的列表:python -m unittest -h

命令行选项

**unittest**支持以下命令行选项:

-b, --buffer

在测试运行期间,将缓冲标准输出和标准错误流。通过测试期间的输出将被丢弃。在测试失败或错误时,通常会回显输出,并将其添加到失败消息中。

-c, --catch

Control-C在测试运行期间,等待当前测试结束,然后报告到目前为止的所有结果。一秒钟Control-C引发正常 KeyboardInterrupt异常。有关提供此功能的功能,请参见信号处理

-f, --failfast:在第一个错误或失败时停止测试运行。

命令行discover,扫描测试目录,发现符合unittest匹配规则的测试模块、测试类、测试方法:

-v, --verbose

详细输出

-s, --start-directory directory`

开始发现的目录(.默认)

-p, --pattern pattern

模式以匹配测试文件(test*.py默认)

-t, --top-level-directory directory

项目的顶层目录(默认为起始目录)

-s-p-t选项可以作为的顺序位置参数传递。以下两个命令行是等效的:

python-m unittest discover-s project_directory-p"*_test.py"python-m unittest discover project_directory"*_test.py"

查看discover命令行选项:python -m unittest discover -h

欢迎加入测试交流群:夜行者自动化测试(816489363)进行交流学习QAQ

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352