单元测试框架之unittest(二)

一、摘要

本章笔者将详细介绍组织测试代码的相关内容,所用的测试例子会是冒泡排序,笔者在从业这么久之后回想很多面试都要问冒泡排序,虽然不知道为什么要问这个,但还是希望大家掌握,它与自动化测试关系不大属于python的基础范畴

在上一篇内容中我们展示了一个小例子,在代码的前两行是如下内容

import unittest
class TestStringMethods(unittest.TestCase): 

它的意义何在呢? import unittest 导入unittest模块,使得我们可以使用它,class TestStringMethods(unittest.TestCase): 新创建的测试类继承了unittest.TestCase,使得我们可以是使用TestCase里的特性

那么它有哪些主要特性呢?

1、测试用例,当我们的测试类继承了unittest.TestCase,若以“def test_xxx(self):”这样的命名方式(test开头)在测试类中定义函数时,它就会被unittest认为是一条测试方法;然而就像我们做手动测试用例的时候,总有一些原则在,那么在写自动化测试用例时有哪些主要的原则呢?

  • 每一个测试用例必须是完全独立的,从而能够单独执行,也可以组团执行
  • 每一个测试用例必须有断言,从而在测试失败的情况下断言异常和一条解释性的语句(AssertionError)将会抛出,此时unittest将会将这条用例标识为失败,其他的异常类型将会被认为是错误(error)
  • 在设计测试用例时要尽可能考虑后续维护的问题,我们要尽可能的减少修改测试代码,从而能够满足快速的迭代测试

2、setUp():这个函数也继承自unittest.TestCase,它的作用是用来完成每一个测试方法执行前的准备工作,如果setUp()方法执行的时候出现异常,那么unittest框架认为测试出现了错误,测试方法是不会被执行的

3、tearDown(): 同样继承自unittest.TestCase,它的作用是每一个测试方法执行完后的清理工作,如果setUp()执行成功,那么测试方法执行成功还是失败,tearDown()方法都会被执行

4、setUpClass(): 同样继承自unittest.TestCase,它的作用是完成在所有测试方法执行前(包括setUp()),单元测试的前期准备工作,必须用@classmethod修饰,整个测试类只执行一次

5、tearDownClass(): 同样继承自unittest.TestCase,它的作用是完成在所有测试方法执行后(包括tearDown()),单元测试的清理工作,必须用@classmethod修饰,整个测试类只执行一次

6、还有一种特例,最简单的测试用例只需要通过覆盖runTest()方法来执行自定义的测试代码,我们称之为静态方法,测试方法名不能重复,也意味着测试类中只能有一个runTest()方法,很显然这样的方式会导致很多冗余代码

7、使用了1到5测试特性构建测试用例的,我们称之为动态方法

二、实例代码

下边将用实例代码详细展示如上概念,待测代码如下

class BubbleSort(object):
    def __init__(self, mylist):
        self.myList = mylist
        self.length = len(mylist)

    def ascending_order(self):
        for i in range(self.length-1):
            for j in range(self.length-1-i):
                if self.myList[j] > self.myList[j + 1]:
                    self.myList[j], self.myList[j+1] = self.myList[j+1], self.myList[j]
        return self.myList

    def descending_order(self):
        for i in range(self.length-1):
            for j in range(self.length-1-i):
                if self.myList[j] < self.myList[j + 1]:
                    self.myList[j], self.myList[j+1] = self.myList[j+1], self.myList[j]
        return self.myList

测试代码如下:

import unittest
from Util.BubbleSort import BubbleSort

class TestBubbleSort(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print("execute setUpClass\n")

    @classmethod
    def tearDownClass(cls):
        print("execute tearDownClass\n")

    def setUp(self):
        self.list1 = [2, 10, 25, 30, 45, 100, 325]
        self.list3 = [325, 10, 25, 45, 30, 100, 2]
        self.list4 = [11, 3, 41, 101, 327, 26, 46]
        self.list2 = [327, 101, 46, 41, 26, 11, 3]

    def tearDown(self):
        print("execute tearDown\n")

    def test_descending_order(self):
        bls = BubbleSort(self.list4)
        self.list5 = bls.descending_order()
        print(self.list5)
        self.assertEqual(self.list5, self.list2)

    def test_ascending_order(self):
        bls = BubbleSort(self.list3)
        self.list6 = bls.ascending_order()
        print(self.list6)
        self.assertEqual(self.list6, self.list1)

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

执行结果应该是

..
execute setUpClass
----------------------------------------------------------------------

Ran 2 tests in 0.001s

[2, 10, 25, 30, 45, 100, 325]
OK
execute tearDown

[327, 101, 46, 41, 26, 11, 3]
execute tearDown

execute tearDownClass

Process finished with exit code 0

三、代码解析

从测试用例的设计和运行结果结合看,意义印证了摘要当中提及的TestCase的特性

原文地址:https://www.cnblogs.com/davieyang/p/10162363.html

时间: 2024-10-10 01:53:01

单元测试框架之unittest(二)的相关文章

Python单元测试框架 :unittest

unittest是xUnit系列框架中的一员,如果你了解xUnit的其他成员,那你用unittest来应该是很轻松的,它们的工作方式都差不多. unittest核心工作原理 unittest中最核心的四个概念是:test case, test suite, test runner, test fixture. 下面我们分别来解释这四个概念的意思,先来看一张unittest的静态类图(下面的类图以及解释均来源于网络,原文链接): 一个TestCase的实例就是一个测试用例.什么是测试用例呢?就是一

单元测试框架之unittest(一)

一.单元测试的含义 unittest单元测试框架的设计灵感来源于Junit(Java语言的单元测试框架),它与其他语言的单元测试框架风格相类似,支持自动化测试.为测试共享setUp和shutDown.它可以在将测试用例聚合到一起形成一个集合一起执行的同时在测试报告中展示独立的测试结果. 为了达到此目的,unittest支持几个重要的面向对象式的概念: 1.test fixture 一个test fixture所做的事情是执行单个或多个测试用例时的准备工作和执行结束后的一些相关清理工作,这包括:创

单元测试框架之unittest(七)

一.摘要 前篇文章已经详细介绍了unittest框架的特性,足以满足我们日常的测试工作,但那并不是unittest的全部,本片博文将介绍一些应该知道但未必能经常用到的内容 然而,想全部掌握unittest还远远不够 二.命令行模式执行用例 unittest框架支持命令行执行测试模块.测试类甚至单独的测试方法 执行测试模块:python -m unittest test_module1 test_module2 ...... 也可以采用路径的方式 python -m unittest tests/

Python单元测试框架:unittest(一)

主要介绍了Python单元测试框架unittest使用方法讲解,本文讲解了unittest概述.命令行接口.测试案例自动搜索.创建测试代码.构建测试套件方法等内容 概述 1.测试脚手架(test fixture) 测试准备前要做的工作和测试执行完后要做的工作.包括setUp()和tearDown(). 2.测试案例(test case) 最小的测试单元. 3.测试套件(test suite) 测试案例的集合. 4.测试运行器(test runner) 测试执行的组件. 命令行接口 可以用命令行运

unittest单元测试框架之unittest 框架的总结(七)

1. Unittest 是 python 自带的单元测试框架,可以用其作为自动化框架来组织测试用例(测 试用例的执行顺序)的执行. 2. Unittest 框架的流程: 写好 TestCase 通过 TestLoader 加载 TestCase 到 TestSuite 中 通过 TextTestRunner 来原型 TestSuite,结果保存在 TextTestResult 中,我们通过命 令行或者 unittest.main()来执行 3.通过 TextTestRunner 来原型 Test

unittest单元测试框架之unittest案例(二)

1.待测方法: 1 # 加法,返回 a+b 的值 2 def add(a,b): 3 return a+b 4 # 减法,返回 a-b 的值 5 def minus(a,b): 6 return a-b 7 # 乘法,返回 a*b 的值 8 def multi(a,b): 9 return a*b 10 # 除法,返回 a/b 的值 11 def divide(a,b): 12 return a/b 2.测试用例 import unittest from UnittestDemo.mathfun

unittest单元测试框架之unittest 框架的总结2(八)

unittest 下的属性 1.Unittest.TestCase:所有测试用例类继承的基本类 2.Unittest.main():将一个单元测试模块变为可直接运行的测试脚本 If __name__ == "__main__": Unittest.main() 3.Unittest.TestSuite:创建测试套件 4.unittest.TextTestRunner():unittest 框架的 TextTestRunner()类,通过该类下面的 run()方 法来运行 suite 所

单元测试框架之unittest(四)

一.摘要 假设我们有一组测试方法差别非常小,比如仅仅是所需要的参数有少许变化时,我们的自动化测试如何进行?unittest框架为这种场景提供了一种方式,它允许我们用subTest()上下文管理器在一个测试方法内识别这种细小的不同,这么说可能有点晕 实际上我觉得还不如直接看代码更能清晰的表达它为我们的测试带来了什么 二.代码实例 # coding:utf-8 import unittest class NumbersTest(unittest.TestCase): def test_even(se

unittest单元测试框架之unittest工作原理(一)

1.Unittest 核心组件 test case.test suite.test runner.test fixture 2.unittest 静态图 Testcase:一个 testcase 就是一个测试用例.Setup(测试环境的准备).run(测试 执行).teardown(测试环境的还原). Testsuite(集合或套件):多个测试用例的集合就是 suite,一个 suite 可以包含多个 测试用例,也可以嵌套 suite. testLoader:用来加载 testcase 到 te