Python unittest单测框架 | 8月更文挑战

195 阅读2分钟

这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战

导语

由于项目程序开发过程中,自测环节是一项非常重要的环节,平常经常使用到python自带的单元测试框架unittest,本文介绍基本的使用方式。

基本组成部分

TestFixture(测试脚手架)

test fixture 表示为了开展一项或多项测试所需要进行的准备工作,以及所有相关的清理操作。举个例子,这可能包含创建临时或代理的数据库、目录,再或者启动一个服务器进程。

TestCase(测试用例)

一个测试用例是一个独立的测试单元。它检查输入特定的数据时的响应。 unittest 提供一个基类: TestCase ,用于新建测试用例。

TestSuite(测试套件)

test suite 是一系列的测试用例,或测试套件,或两者皆有。它用于归档需要一起执行的测试。

TestRunner(测试运行器)

test runner 是一个用于执行和输出测试结果的组件。这个运行器可能使用图形接口、文本接口,或返回一个特定的值表示运行测试的结果。

实际使用

基本实例

#!/usr/bin/python

import unittest


class Test1(unittest.TestCase):

    def test_hello(self):
        word = "hello,world"
        split_word = word.split(",")
        self.assertEqual(["hello", "world"], split_word)

    def test_upper(self):
        word1 = "FOO"
        word2 = "Foo"
        self.assertTrue(word1.isupper())
        self.assertFalse(word2.isupper())

    def test_upper2(self):
        self.assertEqual("foo".upper(), "FOO")


if __name__ == "__main__":
    unittest.main()

解析:

  • 继承unittest.TestCase创建一个测试样例,测试样例中以test开头的方法都是单独测试;
  • 测试方法中assertEqual,assertFalse,assertTrue代表测试过程中会验证条件,如果错误则抛出异常;
  • unittest.main()提供测试脚本的命令行接口,可以直接在命令行调用脚本执行测试;

命令行调用

python simple.py -v
python -m unittest -v simple
python -m unittest -v simple.Test1
python -m unittest -v simple.Test1.test_hello

进阶使用

#!/usr/bin/python

import unittest
import paramiko


class Test1(unittest.TestCase):

    def setUp(self):
        self.client = paramiko.SSHClient()
        self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        self.client.connect(hostname='120.77.144.48', port=22, username='root', password='929833867Lin./')

    def tearDown(self):
        self.client.close()

    def test_Command(self):
        cmd = "hostname"
        stdin, stdout, stderr = self.client.exec_command(cmd)
        hostname = stdout.read()
        print(hostname)
        self.assertEqual("mbb-48", hostname)

    def test_memcache(self):
        cmd = "free -m"
        stdin, stdout, stderr = self.client.exec_command(cmd)
        memcache_info = stdout.read()
        print(memcache_info)


def TestSuite1():
    suite = unittest.TestSuite()
    suite.addTest(Test1("test_Command"))
    suite.addTest(Test1("test_memcache"))
    return suite


if __name__ == "__main__":
    suite = TestSuite1()
    runner = unittest.TextTestRunner()
    runner.run(suite)

解析:

  • 若 setUp() 成功运行,无论测试方法是否成功,都会运行 tearDown() 。 这样的一个测试代码运行的环境被称为 test fixture 。一个新的 TestCase 实例作为一个测试脚手架,用于运行各个独立的测试方法。在运行每个测试时,setUp() 、tearDown() 和 init() 会被调用一次。
  • TestSuite1函数返回一个TestSuite类型,通过这个suite可以将测试的方法组织起来,然后执行起来。
  • test runner执行和输出结果的组件。