• 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

  • 相关阅读:
    jquery实现“上一页、下一页及第一页”操作的无刷算法
    $ ssh -T git@github.com ssh: connect to host ssh.github.com port 22: Connection timed out
    git clone fatal: unable to access 'https://github.com/carlon/demo.git/': Failed to connect to github.com port 443: Timed out
    ESLint
    JS中的对象之原型
    JS中的Promise
    使用过Fetch之后,你还想使用AJAX吗
    Redux中的异步操作
    React全家桶之一 react-router之高级
    React 实践心得:react-redux 之 connect 方法详解
  • 原文地址:https://www.cnblogs.com/chineseluo/p/13710478.html
Copyright © 2020-2023  润新知