• 0
  • 0
分享

  前言

  对于我们测试来说,做自动化测试需要编写测试用例,编写测试用例就会使用到单元测试模块,常见的python单元测试模块有unittest,pytest,nose等,但是听说过最多的也就属于pytest和unittest了,安静今天就通过这一篇文字简单的介绍下pytest和unittest的区别。

  unittest

  说起单元测试,安静立刻想到的就是unittest框架,为什么呢?因为安静刚开始学习的时候也是学习的unittest框架。unittest属于python的内置框架,被广泛的应用到各个项目中。unittest最早的时候是受到junit的启发,unittest支持多种自动化测试用例的编写,以及支持用例前置条件和后置数据清理功能也可以将多个测试用例放在测试集中生成测试报告。

  pytest

  pytest也是基于python的一个单元测试框架,是基于unittest的一个扩展框架,比unittest更加简洁,方便,pytest最主要可以支持第三方插件内容,可以更加高效的完成日常工作。而且pytest也支持unittest的代码框架内容。

  区别

  安静简单的从几个方面进行来说明pytest和unittest之间的区别内容吧。

  断言方面

  unittest的断言是根据自身携带的断言内容,提供了assertEqual,assertTrue,assertFlase等断言函数。

  pytest的断言是根据Python自带的assert断言内容进行使用的。

import pytest
class Test_01:
    def test_01(self):
        a = 'anjing'
        b = 'anjing'
        assert a == b
    def test_02(self):
        '''
        a是否存在b中
        '''
        a = 'anjing'
        b = 'test_anjing'
        assert a in b
    def test_03(self):
        '''
        结果是否为true
        '''
        a = True
        assert a
    def test_04(self):
        '''
        结果是否为false
        '''
        a = False
        assert a== False
if __name__ == '__main__':
    pytest.main(['-sv'])

  用例执行编写规则

  unittest:可以使用自定义测试类内容,但必须继承unittest.TestCase的方法,测试用例需要以test的方法进行编写,用例的执行顺序是根据ASCII的顺序进行执行的。目前不能指定特定的用例顺序。unittest中提供了TestCase(测试用例),TestSuite(测试套件),TestLoder(加载用例),TextTestRunner(执行用例)等方法让测试用例更加方便编写,编写测试用例必须导入unittest模块,执行用例必须带有unittest.main()参数。

  pytest:测试文件名必须以test_开头的py文件或者以*_test.py结尾的py文件,测试类名必须以Test开头,测试用例必须以test_开头。Pytest可以进行执行unittest的用例,pytest的执行顺序可以通过第三方插件进行定制顺序,默认是通过从上往下的顺序进行执行。pytest的执行用例不需要导入模块。执行用例可以通过命令行的形式进行执行。

1-1.png

  前后置操作

  unittest:可以通过setup()和tearDown()的方法来控制用例的前后置操作,并且每条用例执行前后都会执行前后置操作。通过setupclass()和teardownclass()方法来控制一个class下的所有用例都只执行1次前后置操作。

import unittest
class Test(unittest.TestCase):
    def setUp(self):
        print('unittest前置操作,每次执行用例都会进行执行')
    def tearDown(self):
        print('unittest后置操作,每次执行用例都会进行执行')
    @classmethod
    def setUpClass(cls):
        print('所有用例只执行一次前置操作')
    @classmethod
    def tearDownClass(cls):
        print('所有用例只执行一次后置操作')
    def test_01(self):
        print('用例01')
    def test_02(self):
        print('用例02')
    def test_03(self):
        print('用例03')
if __name__ == '__main__':
    unittest.main()

  通过执行后发现,setupclass下的操作只执行了用例操作,setup每条用例执行前都会执行。

1-2.png

  pytest:模块级别的前后置操作(setup_module,teardown_function)表示模块下的测试用例只执行1次前后置操作。

import pytest
def setup_module():
    print('每次用例执行前,只执行一次测试前置操作')
def teardown_module():
    print('每次用例执行后,只执行一次测试后置操作')
def test01():
    print('用例01')
def test02():
    print('用例02')
def test03():
    print('用例03')
if __name__ == '__main__':
    pytest.main(['-vs'])


1-3.png

  函数级别的前后置操作(setup_function,teardown_function)每次执行用例时都需要执行一次前后置操作。

1-4.png

  类级别前后置操作(setup_class,teardown_class)表示类级别中测试用例只执行1次前后置操作。

1-5.png

  方法级别前后置操作(setup_method,teardown_method)表示是在方法级别中每次都执行的用例的前后置操作。

1-6.png

  从上面的多种setup和teardown可以看出来很方便我们进行编写测试用例,但是pytest不仅仅是这些。pytest中有个固件fixture通过装饰器进行使用,使用范围更加广泛,可以随意命名。可以在fixture中编写前后置操作,通过yield进行区别前置操作和后置操作内容。

import pytest
@pytest.fixture()
def login():
    print('测试用例前置操作')
    yield
    print('测试用例后置操作')
class Test:
    def test01(self, login):
        print('用例01')
    def test02(self,login):
        print('用例02')
    def test03(self):
        print('用例03')
if __name__ == '__main__':
    pytest.main(['-vs'])



作者:测试安静   

来源:http://www.51testing.com/html/97/n-4480397.html


2021 问卷礼物图.png

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   摘要:最近公司开始普及周报、月报制度,周报作为一种定期的沟通工具,对于团队协作和项目管理至关重要。它帮助团队成员保持对项目进展的同步了解,促进信息共享,增强团队透明度。周报还能让管理层快速把握团队工作状态,为决策提供支持。此外,周报也是个人展示工作成果、提升工作可见度的有效方式。当我查阅了近百份大家提交的周报后,关于测试周报这块有一些心得分享。  首先我们的周报不是类似于项目里面的测试报告,而是每周测试工作的梳理和总结,  一 编写周报的常见问题  1、工作内容没有突出重点  说到重点,什么内容是重点呢  按照测试计划上来的项目以及领导交代的事情是重点,往往日报是写干了哪些事情,但这些事情...
            0 0 1336
            分享
          •   一、jmeter为什么要做分布式压测  jmeter本身的局限性  一台压力机的 Jmeter 支持的线程数受限于 Jmeter 其本身的机制和硬件配置(内存、CPU等)是有限的  由于 Jmeter 是 Java 应用,对 CPU 和内存的消耗较大,在需要模拟大量并发用户数时,单机很容易出现 JAVA 内存溢出的错误,导致测试脚本本身就有瓶颈  JVM 堆内存的局限性  Java 应用的 jvm 堆内存 heap 受压力机硬件限制,虽然我们可以调整堆内存大小  cmd 启用 Jmeter GUI 时,也会有提示  increase Java Hea...
            0 0 776
            分享
          • 面试官常问问题1、描述一下软件测试活动周期答案:需求评审—测试计划、方案制定—编写测试用例—执行测试用例—缺陷提交、跟踪—伦次回顾、输出测试报告。2、请描述一个bug周期答案:对于我们公司来说,bug创建及关闭是比较规范的,首先是先创建、提交一个缺陷到缺陷管理平台,然后制定给对应的开发负责人修改;等到开发修改完成后,我们会使用开发提供的程序进行验证,如果bug已经解决的话,那么我们会关闭这个bug,如果没有真正解决的话,那就重新打回给对应的开发重新进行解决。3、测试人员在软件开发过程中的任务是什么?答案:1、尽可能早的找出系统中的缺陷  2、避免软件开发过程中缺陷的出现&n...
            0 0 1272
            分享
          •   一、基本控件  1、单选按钮  ·是否只能选择一个选项  · 未进行选择时是否有默认值  2、多选钮  · 可以选择多个选项  3、按钮  · 按钮点击是否有效  · 点击按钮后的跳转页面或者提示是否正确(按钮为新增功能时重复点击是否提交多条重复信息)  · 按钮的点击有效范围  4、下拉菜单  · 下拉菜单的选项是否唯一  · 下拉选项是否可选  5、日期选择控件  · 注意选择起止日期的大小问题,终止日期不得小于起始日期  · 控件有效的选择范围  6、输入框  · 输入内容限定(号码,...
            0 0 1036
            分享
          • 关于单元测试这个概念,我想很多前端的小伙伴都知道,但是却并不一定能描述清楚。由于我开始接触单元测试还是在四个月前,当时也只是做了一些纯函数的单元测试。所以在这里只能说浅谈一下前端单元测试。什么是单元测试?我理解的单元测试就是用于测试一个模块能否到达预期效果。通过代码来定义一个可用的衡量标准,并且可以快速检验。为什么要做单元测试?随着前端的快速发展,各类框架层出不穷,前端实现的业务逻辑也越来越复杂,这时单元测试的作用就凸显出来了。其实目前为止还是有很多代码是缺少单测的,只是现在单测的重视程度越来越高了而已。单测的好处不言而喻,首先可以提高代码的正确性,在上线前做到心里有底。其次当代码需要重构时,...
            0 0 1776
            分享
      • 51testing软件测试圈微信