Python unnitest 测试框架

unittest核心工作原理

unittest中最核心的四个概念是:test case, test suite, test runner, test fixture。
下面我们分别来解释这四个概念的意思,先来看一张unittest的静态类图:


unnitest
  • 一个TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。

  • 而多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。

  • TestLoader是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。

  • TextTestRunner(HTMLTestRunner)是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。测试的结果会保存到TextTestResult(HTMLTestResult)实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。

  • 而对一个测试用例环境的搭建和销毁,是一个fixture。

unittest实例

import unittest


class MyTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print("环境已经准备好,执行所有用例开始")

    @classmethod
    def tearDownClass(cls):
        print("所有用例执行完毕")

    def setUp(self):
        print("start")

    def tearDown(self):
        print("end")

    def test_join(self):
        a = 5 + 1;
        self.assertEqual(a, 6)
        print(a)

    def test_join1(self):
        b = 5 + 2;
        self.assertEqual(b, 7)
        print(b)

    @unittest.skip
    def test_join2(self):
        b = 5 + 2;
        self.assertEqual(b, 10)
        print(b)


if __name__ == "__main__":
    suite = unittest.TestSuite()
    tests = [MyTest("test_join"), MyTest("test_join1")]
    suite.addTests(tests)
    runner = unittest.TextTestRunner()
    runner.run(suite())

import unittest

#from facade.joinquntest import MyTest

# suite = unittest.TestSuite()
# suite.addTest(MyTest("test_join"))
# suite.addTest(MyTest("test_join1"))
# runner = unittest.TextTestRunner()
# runner.run(suite)
suit = unittest.defaultTestLoader.discover("./","join*.py")
runner = unittest.TextTestRunner()
runner.run(suit)

skip装饰器一共有三个 unittest.skip(reason)、unittest.skipIf(condition, reason)、unittest.skipUnless(condition, reason),skip无条件跳过,skipIf当condition为True时跳过,skipUnless当condition为False时跳过。

进阶——用HTMLTestRunner输出漂亮的HTML报告

我们能够输出txt格式的文本执行报告了,但是文本报告太过简陋,是不是想要更加高大上的HTML报告?但unittest自己可没有带HTML报告,我们只能求助于外部的库了。

HTMLTestRunner是一个第三方的unittest HTML报告库,首先我们下载HTMLTestRunner.py,并放到当前目录下,或者你的’C:\Python36\Lib’下

源码附件地址HTMLTestRunner.py

import unittest
from facade.HTMLTestRunner import HTMLTestRunner
import time

cases = unittest.defaultTestLoader.discover("./facade/","join*.py")
nowtime = time.strftime("%Y-%m-%d:%H:%M:%S")
with(open('./reports/'+nowtime+'result.html', 'wb')) as fp:
    runner = HTMLTestRunner(
        stream=fp,
        title='自动化测试',
        description='无其他依赖'
    )
    runner.run(cases,rerun=0,save_last_run=False)

HTMLTestRunner类说明:

stream : 指定报告的路径
title : 报告的标题
description : 报告的描述
run()方法说明:
suit : 运行的测试套件
rerun :重跑次数
save_last_run :是否保存最后一个结果

总结

  • unittest是Python自带的单元测试框架,我们可以用其来作为们自动化测试框架的用例组织执行框架。
  • unittest的流程:写好TestCase,然后由TestLoader加TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中,我们通过命令行或者unittest.main()执行时,main会调用TextTestRunner中的run来执行,或者我们可以直接通过TextTestRunner来执行用例。
  • 一个class继承unittest.TestCase即是一个TestCase,其中以 test开头的方法在load时被加载为一个真正的TestCase。
  • verbosity参数可以控制执行结果的输出,0 是简单报告、1 是一般报告、2 是详细报告。
  • 可以通过addTest和addTests向suite中添加case或suite,可以用TestLoader的loadTestsFrom__()方法。
  • 用 setUp()、tearDown()、setUpClass()以及 tearDownClass()可以在用例执行前布置环境,以及在用例执行后清理环境
  • 我们可以通过skip,skipIf,skipUnless装饰器跳过某个case,或者用TestCase.skipTest方法。
  • 参数中加stream,可以将报告输出到文件:可以用TextTestRunner输出txt报告,以及可以用HTMLTestRunner输出html报告。
    原文链接:https://blog.csdn.net/qq_33214066/article/details/107295051

你可能感兴趣的:(Python unnitest 测试框架)