15. Unittest单元测试框架的介绍与使用

?什么是单元测试

在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。

上面这段内容摘自维基百科。笔者在入职的时候,一直搞不明白什么是单元测试。即使搜了很多资料,也还是搞不明白。一直到接触代码的时候,才对单元测试有了一个大概的认识。当然以前也一直有一个误解,觉得单元测试是开发做的,跟测试同学扯不上关系,直到真正从事自动化工作时,才知道原来单元测试不管是开发还是测试同学都可以做。

可能到这里一些读者还是不明白什么是单元测试,笔者将用自己的理解来解释一下什么是单元测试。同时下面也会给出例子让大家更深入了解什么是单元测试。之前我们讲Python基础的时候,讲到如何定义一个函数。比如我们现在有一个加法函数,需要我们输入两个值,那么我们怎么保证我们写的函数是没有问题的呢?是不是要调用这个函数,然后传入两个值,查看返回值是否正确?其实这就是在做单元测试。当然我们没有用规范的做法去做单元测试,那么什么是规范的方法呢?下面我将会以代码形式举例进行介绍。还是用加法函数来进行举例。如下面代码所示:

def add(a, b):
????return a + b

print(add(1, 3))

我们已经定义一个add函数,现在调用add函数,传入1和3,然后把返回值进行打印,通过打印我们发现打印的结果为4,可以初步这个函数是没问题的,但是我们知道一组数据不能证明这个函数是没错的,所以我们需要多验证几次,这个时候我们又加入了一行测试代码,如下面代码所示:

def add(a, b):

????return a + b

print(add(1, 3))
print(add('a', 3))

运行之后我们发现我们的程序报错了,报错内容如下:

Traceback (most recent call last):
??File "F:/blogApiTest/test2.py", line 6, in
????print(add(‘a‘, 3))
??File "F:/blogApiTest/test2.py", line 2, in add
????return a + b
TypeError: must be str, not int

原来字符串和整型不能相加!当然我们大家都知道在Python程序里字符串和整型不能相加,但是我们就是要传入字符串和整型进行相加,结果程序奔溃了。所以我们可以说这个add函数是有bug的,那么我们来修复一下上面代码,如下面代码所示:

def add(a, b):
????if (type(a) == int or type(a) == float) and (type(b) == int or type(b) == float):
????????return a + b
????else:
????????return "请输入数字"

print(add(1, 3))
print(add('a', 3))

通过测试后我们发现程序已经被我们修复,但是这里我们思考一下,我们在编写测试用例的时候都要写一个预期结果,但是代码中并没有写预期结果,预期结果在我们的脑海里,我们根据打印出来的实际结果跟我们脑海中预期结果进行比对,如果一致说明程序是没问题的,如果不一致,程序是有问题的。想想看,其实挺麻烦的,那么我们有没有办法在代码中写上预期结果和实际结果呢?答案是肯定的,有!使用assert断言!

加入assert断言

assert一般格式是assert condition?, 如果condition为false,那么raise一个AssertionError出来。
比如我们断言1和2是否相等,可以写成 assert 1==2 。知道这个逻辑我们就可以给我们的add函数加上断言,如下代码所示:

def add(a, b):
????if type(a) == int and type(b) == int:
????????return a + b
????else:
????????return "请输入数字"

assert add(1, 2) == 3
assert add(1, 3) == 3

运行之后我们会发现程序报出异常,如下代码所示:

Traceback (most recent call last):
??File "F:/blogApiTest/test2.py", line 9, in
????assert add(1, 3) == 3
AssertionError

通过上面异常我们发现,如果预期结果和实际结果不一致时,assert断言只抛出 AssertionError,这样我们很难搞清断言为什么失败,对于我们排查错误时也造成不必要的时间浪费。那么有没有别的方法可以很快知道为什么会断言失败呢?答案是有的,使用Python Unittest单元的测试框架。

unittest单元测试框架

先贴一下unittest官网地址。unittest文档开头介绍了四个重要的概念:test fixture,test case,?test suite,?test?runner。

test fixture

test fixture表示执行一个或多个测试所需的准备。怎么去理解这句话呢?比如我们执行一条创建文章的测试用例,但是如果我们调用创建文章的接口,需要我们进行登录。那么我们可以把登录作为一个test fixture。那么test fixture表现形式是什么呢?还是用add函数举例。先说test fixture中有几个

test case

测试用例,这个不必多说,没有测试用例就不能叫做接口测试了。

test suite

我们在做接口测试的时候,一般都是执行多条测试用例。这就有了test suite概念,简单来说,就是把想要执行的测试用例进行组装然后进行测试。

test ?runner

执行测试用例。
为了方便大家的理解,会用一个实例对上面四个概念进行解释。请看如下代码:

import unittest

class AddTest(unittest.TestCase):
    def setUp(self):
        print("在每个用例执行之前")

    def tearDown(self):
        print("在每个用例执行之后")

    @classmethod
    def setUpClass(cls):
        print("在用例执行之前,只执行一次,优先于setUp")

    @classmethod
    def tearDownClass(cls):
        print("所有用例运行之后只执行一次,优先于tearDown")

    def add(self, a, b):
        if type(a) == int and type(b) == int:
            return a + b
        else:
            return "请输入数字"

    def test_add1(self):
        self.assertEqual(self.add(2, 3), 5, "验证加法")

    def test_add2(self):
        self.assertEqual(self.add(2, 4), 6, "验证加法")

if __name__ == '__main__':
    # unittest.main()
    # test suite(构造测试集)
    suite = unittest.TestSuite()
    suite.addTest(AddTest("test_add1"))
    suite.addTest(AddTest("test_add2"))
    # test runner?(执行测试)
    runner = unittest.TextTestRunner()
    runner.run(suite)

上面代码输出如下内容:

在用例执行之前,只执行一次,优先于setUp所有用例运行之后只执行一次,优先于tearDown在每个用例执行之前
在每个用例执行之后
在每个用例执行之前
在每个用例执行之后

我们来根据代码拆解一下,看哪部分对应test fixture,test case,?test suite,?test?runner。首先,在使用unittest单元测试框架之前,我们需要导包,我们先import unittest,然后创建一个AddTest类,这个类继承unittest.TestCase。然后我们创建一个add方法(注意:一般类中的函数我们称作为方法),然后创建了2条测试用例test_add1,test_add2,注意!测试用例必须以test开头!然后使用test fixture中setUp、tearDown、setUpClass 、tearDownClass。然后使用test suite把2条测试用例加进去,最后使用test runner执行测试用例。到这里想必大家都已经明白。最后画一张思维导图,更方便大家的理解。

细心的人可以看到,测试用例中有一个assertEqual,这就是我们说比assert更好用的断言,那么这些断言有哪些呢?请看下面表格:

Method Checks that
assertEqual(a,?b) a?==?b
assertNotEqual(a,?b) a?!=?b
assertTrue(x) bool(x)?is?True
assertFalse(x) bool(x)?is?False
assertIs(a,?b) a?is?b
assertIsNot(a,?b) a?is?not?b
assertIsNone(x) x?is?None
assertIsNotNone(x) x?is?not?None
assertIn(a,?b) a?in?b
assertNotIn(a,?b) a?not?in?b
assertIsInstance(a,?b) isinstance(a,?b)
assertNotIsInstance(a,?b) not?isinstance(a,?b)

小结:本章内容只是简单介绍了一下unittest的使用方法以及相关概念,unittest框架使用起来很简单也很方便,建议大家多去官网学习,当然不管是UI自动化也好,还是接口自动化也好,如果使用Python实现,一般都不会绕过Unittest这个概念,希望大家可以熟练掌握。

原文地址:https://www.cnblogs.com/suim1218/p/10569753.html

时间: 2024-10-10 01:52:51

15. Unittest单元测试框架的介绍与使用的相关文章

Selenium基于Python web自动化基础二 -- 免登录、等待及unittest单元测试框架

一.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去掉验证码 1.手动在请求中添加cookies信息 1 url = "http://www.baidu.com" 2 driver = webdriver.Firefox() 3 driver.get(url) 4 time.sleep(3) 5 #添加cookies的方式 6 7 c1 =

python3+unittest单元测试框架

#unittest单元测试框架,主要由四部分组成:测试固件.测试用例.测试套件.测试执行器 #1.测试固件: '''def setUp(self): # 每条用例执行前都要执行,例如测试前的准备工作 print('setup') def tearDown(self): # 每条用例执行后都要执行,例如测试执行完成后的清除配置工作 print('tearDown') ''' #例如: 1 import unittest 2 3 def calc(a,b): 4 return a+b 5 6 cla

Python+Selenium ----unittest单元测试框架

unittest是一个单元测试框架,是Python编程的单元测试框架.有时候,也做叫做"PyUnit",是Junit的Python语言版本.这里了解下,Junit是Java语言的单元测试框架,Java还有一个很好用的单元测试框架叫TestNG,本系列只学习Python,所以只需要unittest是Python里的一个单元测试框架就可以了.       unittest支持测试自动化,共享测试用例中的初始化和关闭退出代码,在unittest中最小单元是test,也就是一个测试用例.要了解

Python基础入门-unittest单元测试框架

unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者就总结下如何使用unittest单元测试框架来进行WEB自动化测试. 目录 一.unittest模块的各个属性说明 二.使用unittest框架编写测试用例思路 三.使用unittest框架编写测试用例实例 一.unittest模块的各个属性说明 先来聊一聊unittest模块的各个属性,所谓知己知

unittest单元测试框架总结

unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者就总结下如何使用unittest单元测试框架来进行WEB自动化测试. 目录 一.unittest模块的各个属性说明 二.使用unittest框架编写测试用例思路 三.使用unittest框架编写测试用例实例 一.unittest模块的各个属性说明 点击返回目录 先来聊一聊unittest模块的各个属

unittest单元测试框架小白入门

unittest单元测试框架: 一般也称为pyunit,是从java程序中广泛应用的junit启发而来的,unittest使我们具备创建测试用例,测试套件,测试·夹具的能力.unittest组件:1):Test fixture(测试夹具): 使用测试夹具,可以定义在单个或多个测试执行之前的准备工作和执行之后的清理工作.2)Test Case(测试用例):unittest中执行测试的最小单元,通过验证unittest提供的assert方法来验证一组特定的操作和输入以后得到的响应,unittest提

第 6 章 unittest 单元测试框架 - Selenium3 自动化测试

第 6 章 unittest 单元测试框架 单元测试是一项对技术要求很高的工作,只有白盒测试人员和软件开发人员才能胜任但用单元测试框架做单元测试却十分简单,而且单元测试框架不仅可以用来做单元测试,它还适用于不同类型的「自动化」测试. 1.提供测试用例组织和执行在 Python 中,我们编写的代码可以定义类.方法和函数,那么如何定义一条「测试用例」?如何灵活地控制这些「测试用例」的执行?单元测试框架会告诉我们. 2.提供丰富的断言方法当我们进行功能测试时,测试用例需要有预期结果.当测试用例的执行结

Selenium自动化测试-unittest单元测试框架使用

一.什么是unittest 这里我们将要用的unittest是python的单元测试框架,它的官网是 https://docs.python.org/2/library/unittest.html,在这里我们可以得到全面的信息. 当我们写的用例越来越多时,我们就需要考虑用例编写的规范与组织,以便于后期的维护,而unittest正是这样一款工具.我们这里用一个示例来展示用unittest脚本是什么样子的 1 # -*- coding: utf-8 -*- 2 from selenium impor

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

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