想了很久还是打算就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:
test suite:
一个测试套件是测试用例,测试套件,或两者的集合。它用于汇总应一起执行的测试。即测试套件之间可以嵌套,也可以只有一个测试套件,在套件中包含测试用例。
test runner :
测试运行是编排的测试的执行,并提供结果给用户的部件。也就是相当于,框架的入口,他会收集脚本,执行脚本,输出结果。
通过TestCase
和FunctionTestCase
类支持测试用例和测试夹具概念 。在创建新测试时应使用前者,而在将现有测试代码与 unittest
驱动框架集成时可以使用后者。FunctionTestCase
会放在后面作为高级的一部分给大家进行分享讲解,在实际工作中通常也只会用到TestCase
。
测试套件由TestSuite
类实现。此类允许单个测试和测试套件的聚合;执行套件时,将运行直接添加到套件和子测试套件中的所有测试。
测试运行程序是提供单个方法的对象,该方法 run()
接受TestCase
或TestSuite
对象作为参数,并返回结果对象。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
------------------------------------
"""
import unittest
# 继承unittest.TestCase
class TestStringMethods(unittest.TestCase):
# 每一个测试方法以test开头,才可以被runner扫描到
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
s = 'hello world'
# 检查分割后的字符串是否相等,比较的s.split()这个分割后的列表与['hello', 'world']是否相等
self.assertEqual(s.split(), ['hello', 'world'])
# 断言是否会抛出TypeError异常
with self.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项目的顶层目录(默认为起始目录)
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