Python接口自动化测试之pytest与unittest区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python接口自动化测试之pytest与unittest区别相关的知识,希望对你有一定的参考价值。

  背景

  为啥把单元测试框架介绍放到这里讲,其实主要是想讲pytest框架的应用。这也是应网友的心声。其实pytest框架我以前是用在实际项目中的,只是一直没有将实践过程和经验教训沉淀下来。如今,我想还是写几篇关于pytest框架的应用。但是,在这之前,你必须先了解一下python单元测试框架的一些常识。

  引言

  我们在使用python做接口测试的时候,搭建的接口测试框架都是python的单元测试框架,而python的单元测试框架很多unittest、pytest、nose等,其中unittest单元测试框架,这个我之前介绍了很多实战,具体可以参考接口测试框架

  什么是单元测试

  我们知道软件测试按开发阶段划分:单元测试,集成测试,系统测试,验收测试,用户测试等。这里说的单元测试,就是第一阶段,一般都是开发去做,在国内绝大部分公司都是开发去做单元测试。单元测试就是测试的对象是程序中的最小单元。程序的最小单元可以是一个函数,一个类,也可以是函数的组合,类的组合。

  什么是框架

  框架——软件框架(software framework),通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范,也指为了实现某个软件组件规范时,提供规范所要求之基础功能的软件产品。

  ——百度百科

  简单来说,框架是提供一些基本的功能与约束条件,让你去实现业务功能。举个生活栗子,给你个厨房,你可以用来做饭,烧烤和用作杂物间等,但是你不可能放张床,用来睡觉(豪宅别墅除外)。厨房提供的是厨房的框架,你必须遵从框架内的约束,去做你想做的事。超过框架之外的功能是无法实现。

  什么是自动化测试框架

  自动化测试框架,简单来说就是应用自动化测试的框架。这句话好像是废话。其实,就是为了解决某些特定问题和测试需求,而开发解决问题的组件。

  自动化测试框架的定义为:由一个或多个自动化测试基础模块、自动化测试管理模块、自动化测试统计模块等组成的工具集合————百度百科。

如果还不理解,再继续上面那个生活栗子,给你一个厨房,厨房是用来做饭的,这是框架的约束,但是一个空厨房没有东西,就是一个空架子,得买厨具、食物蔬菜大米等,才能做饭。这些硬性的东西就是需要开发的组件。解决的问题就是吃饭问题。大家请自行脑补。

  接口自动化测试框架可以学习我这篇文章:基于Python接口自动化测试框架(初级篇)附源码

  Python三大主流框架

  第一种:unittest

  unittest是Python标准库中自带的单元测试框架。unittest有时候也被称为PyUnit。就像JUnit是Java语言的标准单元测试框架一样,unittest(PyUnit)则是Python语言的标准单元测试框架。

  unittest支持自动化测试,测试用例的初始化和关闭,测试用例的聚合等功能。unittest有一个很重要的特性:它通过类(class)的方式,将测试用例组织在一起。

  unittest不需要单独去下载安装,python内置单元测试框架直接使用。

 

 具体看例子:

# -*- coding: utf-8 -*-
\'\'\'
@author: Leo

@software: pycharm

@file:  test.py

@time: 2020/5/6 0006 23:25

@Desc:

\'\'\'
__author__ = \'Leo\'

import unittest

class Testunittest(unittest.TestCase):
    def test_001(self):
        self.assertEqual(\'abc\'.upper(),\'ABC\')

if __name__ == \'__main__\':
    unittest.main()

  

运行结果:

 

 

 

  第二种:nose

nose是Python的一个第三方单元测试框架。这意味着,如果要使用nose,需要先显式安装它:

>pip install nose
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: nose in d:\\python3\\lib\\site-packages (1.3.7)

 

简单的例子:

import  nose

def test_001():
    assert \'abc\'.upper() == \'ABC\'
    pass

if __name__ == \'__main__\':
    nose.runmodule()

  

运行结果:

 

 

温馨提示:

nose已经进入维护模式,从github (https://github.com/nose-devs/

nose/commits/master)上可以看到,nose最近的一次代码提交还是在2016年5月4日。继承nose的是nose2,但要注意的是,nose2并不支持nose的全部功能,它们的区别可以参见:

https://nose2.readthedocs.io/en/latest/differences.html。

nose2的主要目的是扩展Python的标准单元测试库unittest,因此它的定位是“带插件的unittest”。nose2提供的插件,例如测试用例加载器,覆盖度报告生成器,并行测试等内置插件和第三方插件,让单元测试变得更加完善。

  第三种:pytest

pytest是Python另一个第三方单元测试库。它的目的是让单元测试变得更容易,并且也能扩展到支持应用层面复杂的功能测试。

pytest的特性有:

1)支持用简单的assert语句实现丰富的断言,无需复杂的self.assert*函数

2)自动识别测试模块和测试函数

3)兼容unittest和nose测试集

4)支持Python3和PyPy3

5)丰富的插件生态,已有300多个各式各样的插件,和活跃的社区

 

简单例子:

import pytest

def test_001():
    assert \'abc\'.upper() == \'ABC\'

if __name__ == \'__main__\':
    pytest.main()

 

运行结果:

 

 

再看一个例子:

import pytest

def add_test(x):
    return x + 1

def test_001():
    assert add_test(3) == 2

if __name__ == \'__main__\':
    pytest.main(\'-s\',\'test.py\')

 

运行结果:

 

 

备注:

1、如果是在命令行模式运行的话,-s会显示打印的内容,不加的话,就不会显示。

2、如果是使用pycharm运行的话,加不加-s都可以。

3、不需要main函数,pytest自动识别test_开头的测试方法(用例)。

4、pytest兼容unittest框架的代码,可以用来运行unittest测试用例。

如图:

 

 

  总结

  以上是python的单元测试框架,当然还有一个基于python的自动化测试框架RobotFramework,严格意义上来讲它是测试工具。后面我会持续分享,敬请期待!

以上是关于Python接口自动化测试之pytest与unittest区别的主要内容,如果未能解决你的问题,请参考以下文章

pytest接口自动化测试框架 | pytest之fixture介绍

python接口自动化11-pytest入门

Python自动化测试框架之unittest和pytest

pytest接口自动化测试框架 | 用python代码测试接口

Python测试框架之unittest和pytest

pytest接口自动化测试框架 | unittest与pytest的区别