IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> unittest模块:单元测试 -> 正文阅读

[开发测试]unittest模块:单元测试

unittest浅析,通过元类实现按书写顺序执行单元测试函数
utx,一个基于unittest的功能很多的测试用代码库
metaclass的用法

为了实现按书写顺序执行单元测试函数,找了一些资料,最后实现了这个功能,代码如下:

import unittest
from unittest import TestLoader
from fnmatch import fnmatchcase


class UnittestMetaclass(type):
    def __new__(cls, name, bases, attrs):
        # add 'attrs_by_writing_order' attribute containing writing order of all attributes and functions
        attrs["attrs_by_writing_order"] = list(attrs.keys())
        return super().__new__(cls, name, bases, attrs)


# TestLoader默认按照函数的字母序进行测试,有时候我们的函数是需要依次执行的,要安装书写的
# 顺序执行,因此这里重写TestLoader的sortTestMethodsUsing,不另做排序,即可按照书写顺序执行
# 但是打印错误日志的时候,是先打印Error再打印Fail,在二者都有的时候打印顺序还是会跟执行顺序
# 有所不同,但是没有关系,Error在前警示作用比较强,也挺好的,只要执行顺序能按照我们想要的来就可以了
class OrderedTestLoader(TestLoader):
    """This TestLoader will load testFnNames in the code writing order"""
    # copied from getTestCaseNames() of TestLoader and make some modification
    def getTestCaseNames(self, testCaseClass):
        """Return a sorted sequence of method names found within testCaseClass
        """
        def shouldIncludeMethod(attrname):
            if not attrname.startswith(self.testMethodPrefix):
                return False
            testFunc = getattr(testCaseClass, attrname)
            if not callable(testFunc):
                return False
            fullName = f'%s.%s.%s' % (
                testCaseClass.__module__, testCaseClass.__qualname__, attrname
            )
            return self.testNamePatterns is None or \
                any(fnmatchcase(fullName, pattern) for pattern in self.testNamePatterns)
        testFnNames = list(filter(shouldIncludeMethod, testCaseClass.attrs_by_writing_order))

        return testFnNames


# 声明一个类,从unittest.TestCase类派生,默认情况下每一个以test开头的成员函数都会被当作单元测试函数
# NOTE: 每个测试函数的名字必须以test开头,否则将不会被自动执行(不想参与测试的函数请不要以test开头命名)
class TestDemo(unittest.TestCase, metaclass=UnittestMetaclass):
    r"""Author: zhang.haojian
    本测试类的测试结果为".FF..E.","."表示测试通过,"F"表示不通过,"E"表示在执行测试函数时发生了并非由assert*系列函数引发的异常
    测试结果的输出顺序是按函数名的字母序,与代码中的函数声明顺序不一定一致
    形如FAIL: 测试函数名 (测试类名) 的是一个测试函数不通过时的提示行,下接断言异常信息,请核对代码并修改至测试通过之后再提交
    如果所有样例都通过,最后会输出"OK",否则会输出FAILED (failures=2, errors=1)的字眼,告诉用户有几个样例failure了,有几个样例error了
    """
    def setUp(self):
        # 在运行每一个测试方法前都会先执行setUp函数,若setUp()方法引发异常,测试方法将不会被运行
        pass

    def tearDown(self):
        # 若setUp()成功运行,无论测试方法是否成功,都会运行tearDown(),这里可以放一些后处理的代码
        pass

    def test_equal(self):
        s = "this is a demo function"
        # assertEqual determine whether two objects are equal
        self.assertEqual(s, "this is a demo function")

    def test_equal2(self):
        s = "this is another demo function"
        self.assertEqual(s, "this is a demo function")

    def test_in(self):
        l = ["a", "b"]
        # assertIn determine whether the member is in container
        self.assertIn("c", l)

    def test_isinstance(self):
        s = "I am a string"
        # assertIsInstance determine whether the variable is instance of a certain type 
        self.assertIsInstance(s, str)

    def test_bool(self):
        d = {"a": "ABC"}
        # assertTrue determine whether the condition is True
        self.assertTrue(d["a"].isupper())

    def test_error(self):
        # raise an error
        raise RuntimeError("a RuntimeError")

    def test_assert_raise(self):
        def change_tuple(t):
            t[0] = 1
        d = (1, 2)

        # assertRaises catch an expected error with known type
        self.assertRaises(TypeError, change_tuple, d)

        # assertRaisesRegex catch an expected error with known type and message
        self.assertRaisesRegex(TypeError, "'tuple' object does not support item assignment", change_tuple, d)

        # they can be used in context environment
        with self.assertRaisesRegex(TypeError, "'tuple' object does not support item assignment") as cm:
            d[0] = 1


if __name__ == "__main__":
    # `unittest.main()` is the standard usage to start testing, here we use a customed
    # TestLoader to keep executing order of functions the same as their writing order
    unittest.main(testLoader=OrderedTestLoader())

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:52:24  更:2022-03-08 22:53:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 3:00:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码