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
------------------------------------
"""
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

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

-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

posted @ 2020-09-22 10:17  成都-阿木木  阅读(134)  评论(0编辑  收藏  举报