前言

我们在做自动化的时候,常常有这样的需求:

  • 执行每一条用例时,都重新启动一次浏览器

  • 每一条用例执行结束时,都清除测试数据

在unittest中,我们可以使用 setUp() 和 tearDown() 两个方法来实现以上需求,其中 setUp() 方法用于初始化测试固件;而 tearDown() 方法用于销毁测试固件。程序会在运行每个测试用例(以 test_ 开头的方法)之前自动执行 setUp() 方法来初始化测试固件,井在每个测试用例(以 test_ 开头的方法)运行完成之后自动执行 tearDown() 方法来销毁测试固件。

那么如何实现只启动一次浏览器,所有测试用例执行结束后再清除数据这样的需求呢?

  • unittest提供了setUpClass()和tearDownClass()两个方法,配合@classmethod装饰器使用即可

作为比unittest更强大的框架,pytest自然也有类似的方法

pytest的setup/teardown方法包括:

  • 模块级别(setup_module/teardown_module)
  • 函数级别(setup_function/teardown_function)
  • 类级别(setup_class/ teardown_class)
  • 方法级别(setup_method/teardown_methond或者setup/teardown)

模块级别

模块中的第一个用例开始前执行一次setup_module方法,模块中的最后一个测试用例结束后执行一次teardown_module方法

import pytest

def setup_module():
print("执行setup_module") def teardown_module():
print("执行teardown_module") class TestDemo(object):
def test_case1(self):
print("执行测试用例1")
assert 1 + 1 == 2 def test_case2(self):
print("执行测试用例2")
assert 1 + 3 == 4 def test_case3(self):
print("执行测试用例3")
assert 1 + 5 == 6

运行结果如下:

函数级别

在每个测试函数前运行一次setup_function方法,在每个测试函数结束后运行一次teardown_function方法,只对函数用例生效,不在类中。

import pytest

def setup_function():
print("执行setup_function") def teardown_function():
print("执行teardown_function") def test_case1():
print("执行测试用例1")
assert 1 + 1 == 2 def test_case2():
print("执行测试用例2")
assert 1 + 3 == 4 def test_case3():
print("执行测试用例3")
assert 1 + 5 == 6

运行结果如下:

类级别

setup_class/teardown_class 对类有效,位于类中,在执行测试类之前和之后各调用一次

import pytest

class TestDemo(object):
def setup_class(self):
print("执行setup_class") def teardown_class(self):
print("执行teardown_class") def test_case1(self):
print("执行测试用例1")
assert 1 + 1 == 2 def test_case2(self):
print("执行测试用例2")
assert 1 + 3 == 4 def test_case3(self):
print("执行测试用例3")
assert 1 + 5 == 6

运行结果如下:

方法级别

setup_method/teardown_method和setup/teardown,在测试类中每个测试方法前后调用一次。这两个方法效果是一样的

import pytest

class TestDemo(object):
def setup_method(self):
print("执行setup_method") def teardown_method(self):
print("执行teardown_method") def test_case1(self):
print("执行测试用例1")
assert 1 + 1 == 2 def test_case2(self):
print("执行测试用例2")
assert 1 + 3 == 4 def test_case3(self):
print("执行测试用3")
assert 1 + 5 == 6

运行结果如下:

四种级别混合使用

如果把这四种级别的方法混合使用,运行顺序如何呢?

import pytest

def setup_module():
print("模块开始时,执行setup_module") def teardown_module():
print("模块结束时,执行teardown_module") def setup_function():
print("函数用例开始时,执行setup_function") def teardown_function():
print("函数用例结束时,执行teardown_function") def test_a():
print("执行测试函数a") def test_b():
print("执行测试函数b") class TestDemo(object):
def setup_class(self):
print("测试类开始时,执行setup_class") def teardown_class(self):
print("测试类结束时,执行teardown_class") def setup_method(self):
print("类中的方法开始时,执行setup_method") def teardown_method(self):
print("类中的方法结束时,执行teardown_method") def test_case1(self):
print("执行测试用例1")
assert 1 + 1 == 2 def test_case2(self):
print("执行测试用例2")
assert 1 + 3 == 4 def test_case3(self):
print("执行测试用例3")
assert 1 + 5 == 6

运行结果如下:

总结

  • 模块级(setup_module/teardown_module)开始于模块始末,全局的
  • 函数级(setup_function/teardown_function)只对函数用例生效(不在类中)
  • 类级(setup_class/teardown_class)只在类中前后运行一次(在类中)
  • 方法级(setup_method/teardown_method或setup/teardown)开始于方法始末(在类中)

Pytest学习笔记2-setup和teardown的更多相关文章

  1. [转载]pytest学习笔记

    pytest学习笔记(三)   接着上一篇的内容,这里主要讲下参数化,pytest很好的支持了测试函数中变量的参数化 一.pytest的参数化 1.通过命令行来实现参数化 文档中给了一个简单的例子, ...

  2. pytest学习笔记(pytest框架结构)

    一.pytest框架中使用setup.teardown.更灵活按照用例级别可以分为以下几类: 1.模块级:(setup_module.teardown_module)在模块始末调用 2.函数级:(se ...

  3. pytest学习笔记

    From: https://blog.csdn.net/gaowg11/article/details/54910974 由于对测试框架了解比较少,所以最近看了下pytest测试框架,对学习心得做个记 ...

  4. Pytest学习笔记3-fixture

    前言 个人认为,fixture是pytest最精髓的地方,也是学习pytest必会的知识点. fixture用途 用于执行测试前后的初始化操作,比如打开浏览器.准备测试数据.清除之前的测试数据等等 用 ...

  5. pytest 学习笔记一:参数化与组织分层

    组织分层: 1.普通方式,和unittest分层类似: setup_module()  # 通常放在类外 setup_class(cls) setup(self) teardown(self) tea ...

  6. pytest学习笔记二 fixtrue

    前言 官方文档关于fixture功能的解释如下: The purpose of test fixtures is to provide a fixed baseline upon which test ...

  7. 『德不孤』Pytest框架 — 10、setUp()和tearDown()函数

    目录 1.setUp()和tearDown()函数介绍 2.setUp()和tearDown()函数作用 3.setUp()和tearDown()函数说明 4.示例 (1)方法级 (2)类级 (3)函 ...

  8. pytest学习笔记(二)

    继续文档的第二章 (一)pytest中可以在命令行中静态/动态添加option,这里没什么好讲的,略过... 这里面主要讲下如何试用skip/xfail,还有incremental(包含一些列的测试步 ...

  9. pytest 学习笔记一 入门篇

    前言 之前做自动化测试的时候,用的测试框架为Python自带的unittest框架,随着工作的深入,发现了另外一个框架就是pytest (官方地址文档http://www.pytest.org/en/ ...

随机推荐

  1. Educational Codeforces Round 105 (Rated for Div. 2)

    A. ABC String 题目:就是用'('和')'来代替A,B,C并与之对应,问是不是存在这样的对应关系使得'('和')'正好匹配 思路:第一个和最后一个字母是确定的左括号或者是右括号,这样就还剩 ...

  2. Summer——从头开始写一个简易的Spring框架

    Summer--从头开始写一个简易的Spring框架                ​ 参考Spring框架实现一个简易类似的Java框架.计划陆续实现IOC.AOP.以及数据访问模块和事务控制模块. ...

  3. MD5加密以及登录获取设置token

    MD5简介 MD5是不可逆的加密算法,基本上是不可破解的,网上有些破解网站,其实是利用了穷举法,因为MD5生成的串是一样的,他们会将常规的密码生成MD5加密串,保存,然后破解的时候去穷举比对.(应对之 ...

  4. [bug] Nginx:src/os/unix/ngx_user.c:36:7: 错误:‘struct crypt_data’没有名为‘current_salt’的成员

    参考 https://blog.csdn.net/yu_pan_love_cat/article/details/103035513 https://www.cnblogs.com/hxlinux/p ...

  5. [刷题] PTA 7-32 说反话-加强版

    题目描述: 给定一个英语句子,各个单词之间用空格分隔.要求编写程序,将所有单词倒序输出 输入示例: Hello World Here I Come 输出示例: Come I Here World He ...

  6. 搞清楚 硬件环境 os环境 网络环境 搞清楚测试工具 测试步骤 自己搭测试环境 自测

    1,遇事的第一反应要从变化情绪转变为做出判断.判断什么?判断这一件事对自己是否重要,是否关乎我的个人利益,是否影响我的人际关系等等等等.如果答案都是否,那就没必要着急忙慌了.如果答案是是 冷静,其实是 ...

  7. LTC3780 工作原理分析

    流程分析 当 CV调节 调节顺时针调节CV的时候 接入电路部分的电阻变大 Vosense变小 LTC内部的误差放大器 输出的变大 LTC内部逻辑调节 增大电压 我估计最终电压还是大约800mv左右 可 ...

  8. 10.5 arp:管理系统的arp缓存

    arp命令 用于操作本机的arp缓存区,它可以显示arp缓存区中的所有条目.删除指定的条目或者添加静态的IP地址与MAC地址的对应关系.     什么是arp?即地址解析协议(ARP,Address ...

  9. python工业互联网应用实战17—前后端分离模式之django template vs jquery3

    上一章节我们完成了"CRUD"的后面3个功能点,新增由于改动较大我们专门增加本章来阐述,主要是完成技术栈切换后,会发现模板的代码判断过多,逻辑过于复杂.对未来存在的扩展和维护友好性 ...

  10. 聊聊 apt sources.list 文件格式

    前言 之前玩 ubuntu 需要切换国内源地址时,都是网上复制别人提供好的,也不知道是什么意思,拿来就用. 这次花点时间来看一下 apt sources.list 的格式,以及其表示的含义. 格式 s ...