写点什么

pytest 学习和使用 4-pytest 和 Unittest 中 setup、teardown 等方法详解和使用(最全)

作者:虫无涯
  • 2023-03-21
    陕西
  • 本文字数:4847 字

    阅读完需:约 16 分钟

@TOC

1 Unittest 两种前置和两种后置方法

  • 使用 Unittest 框架结合 selenium 做 webUI 自动化测试的时候,经常会遇到什么时候打开和关闭浏览器,这个时候就使用到了 Unittest 两种前置和两种后置方法;

  • 那具体这四种方法是什么呢?看下表:


  • 而 setupClass()和 teardownClass() 方法用配合@classmethod方法使用。

1.1 Unittest:setup、teardown 方法举例

  • 创建一个脚本test_unittest_setup_teardown.py,写入以下代码:


# -*- coding:utf-8 -*-# 作者:NoamaNelson# 日期:2021/9/9 9:25# 文件名称:test_unittest_setup_teardown.py# 作用:验证unittest的setup、teardown方法# 联系:VX(NoamaNelson)# 博客:https://blog.csdn.net/NoamaNelson

import unittest

class TestOne(unittest.TestCase): def setUp(self) -> None: print("每运行一个case前,打开一次浏览器")
def tearDown(self) -> None: print("每运行一个case后,关闭一次浏览器")
def test_one(self): print("运行第一个用例")
def test_two(self): print("运行第二个用例")

if __name__ == "__main__": unittest.main()
复制代码


  • 运行后如下:


Ran 2 tests in 0.003s
OKLaunching unittests with arguments python -m unittest F:/pytest_study/test_case/test_b/test_unittest_setup_teardown.py in F:\pytest_study\test_case\test_b

进程已结束,退出代码 0每运行一个case前,打开一次浏览器运行第一个用例每运行一个case后,关闭一次浏览器每运行一个case前,打开一次浏览器运行第二个用例每运行一个case后,关闭一次浏览器
复制代码

1.2 Unittest:setupClass、teardownClass 方法举例

  • 创建一个脚本test_unittest_setupclass_teardownclass.py,写入以下代码:


# -*- coding:utf-8 -*-# 作者:NoamaNelson# 日期:2021/9/9 9:50# 文件名称:test_unittest_setupclass_teardownclass.py# 作用:验证unittest的setupclass、teardownclass方法# 联系:VX(NoamaNelson)# 博客:https://blog.csdn.net/NoamaNelson

import unittest

class TestTwo(unittest.TestCase): @classmethod def setUpClass(cls) -> None: print("每运行一个用例集前,打开浏览器,即这个类只打开一次浏览器")
@classmethod def tearDownClass(cls) -> None: print("每运行一个用例集后,关闭浏览器,即这个类只关闭一次浏览器")
def test_one(self): print("运行第一个用例")
def test_two(self): print("运行第二个用例")

if __name__ == "__main__": unittest.main()
复制代码


  • 运行后如下:


Ran 2 tests in 0.002s

OK每运行一个用例集前,打开浏览器,即这个类只打开一次浏览器运行第一个用例运行第二个用例每运行一个用例集后,关闭浏览器,即这个类只关闭一次浏览器
进程已结束,退出代码 0
复制代码


  • 注意这两个方法需要使用@classmethod修饰方法,如果不加的话会报错。

2 Pytest 十种前置和后置方法

  • 和 unittest 类似,但是方法更多,达到了十种,详细看下表:



2.1 Pytest:setup_module、teardown_module 方法举例

  • 创建test_pytest_setup_teardown_module.py,代码如下:


# -*- coding:utf-8 -*-# 作者:NoamaNelson# 日期:2021/9/9 10:18# 文件名称:test_pytest_setup_teardown_module.py# 作用:验证pytest的setup_module和teardown_module方法# 联系:VX(NoamaNelson)# 博客:https://blog.csdn.net/NoamaNelson

import pytest

def setup_module(): print("整个.py模块开始前只执行一次")

def teardown_module(): print("整个.py模块结束后只执行一次")

def test_one(): print("用例1")

def test_two(): print("用例2")

class TestOne(): # @staticmethod # def setup_module(): # print("整个.py模块开始前只执行一次") # # @staticmethod # def teardown_module(): # print("整个.py模块结束后只执行一次") def test_thr(self): print("用例3")
def test_fo(self): print("用例4")

if __name__ == "__main__": pytest.main()
复制代码


  • 运行结果:


(venv) F:\pytest_study\test_case\test_c>pytest -s -q整个.py模块开始前只执行一次用例1.用例2.用例3.用例4.整个.py模块结束后只执行一次
4 passed in 0.02s
复制代码


  • 把这两个方法写入类中呢,那需要使用@staticmethod方法修饰,不然语法就不对,但是写入类中的话,这两个方法应该是不会运行的。

2.2 Pytest:setup_function、teardown_function 方法举例

  • 创建test_pytest_setup_teardown_function.py,代码如下:


# -*- coding:utf-8 -*-# 作者:NoamaNelson# 日期:2021/9/9 10:41# 文件名称:test_pytest_setup_teardown_function.py# 作用:验证pytest的setup_function、teardown_function方法# 联系:VX(NoamaNelson)# 博客:https://blog.csdn.net/NoamaNelson

import pytest

def setup_module(): print("整个.py模块开始前只执行一次")

def teardown_module(): print("整个.py模块结束后只执行一次")

def setup_function(): print("每个函数级别用例开始前都执行")

def teardown_function(): print("每个函数级别用例结束后都执行")

def test_one(): print("用例1")

def test_two(): print("用例2")

class TestOne():
def test_thr(self): print("用例3")
def test_fo(self): print("用例4")

if __name__ == "__main__": pytest.main()
复制代码


  • 运行如下:


(venv) F:\pytest_study\test_case\test_c>pytest -s -q test_pytest_setup_teardown_function.py整个.py模块开始前只执行一次每个函数级别用例开始前都执行用例1.每个函数级别用例结束后都执行每个函数级别用例开始前都执行用例2.每个函数级别用例结束后都执行用例3.用例4.整个.py模块结束后只执行一次
4 passed in 0.42s
复制代码


  • 同样把这两个方法写入类中呢,那需要使用@staticmethod方法修饰,不然语法就不对,但是写入类中的话,这两个方法应该是不会运行的。

2.3 Pytest:setup_class、teardown_class 方法举例

  • 创建test_setup_teardoen_class.py代码如下:


# -*- coding:utf-8 -*-# 作者:NoamaNelson# 日期:2021/9/9 11:28# 文件名称:test_pytest_setup_teardoen_class.py# 作用:xxx# 联系:VX(NoamaNelson)# 博客:https://blog.csdn.net/NoamaNelson

import pytest

def setup_module(): print("整个.py模块开始前只执行一次")

def teardown_module(): print("整个.py模块结束后只执行一次")

def test_one(): print("用例1")

def test_two(): print("用例2")

class TestOne():
def setup_class(self): print("整个测试类开始前只执行一次")
def teardown_class(self): print("整个测试类结束后只执行一次")

def test_thr(self): print("用例3")
def test_fo(self): print("用例4")

if __name__ == "__main__": pytest.main()
复制代码


  • 运行结果为:


(venv) F:\pytest_study\test_case\test_c>pytest -s -q test_setup_teardoen_class.py整个.py模块开始前只执行一次用例1.用例2.整个测试类开始前只执行一次用例3.用例4.整个测试类结束后只执行一次整个.py模块结束后只执行一次
4 passed in 0.02s
复制代码

2.4 Pytest:setup_method、teardown_method 方法举例

  • 创建test_pytest_setup_teardown_method.py,代码如下:


# -*- coding:utf-8 -*-# 作者:NoamaNelson# 日期:2021/9/9 12:28# 文件名称:test_pytest_setup_teardown_method.py# 作用:验证pytest的setup_method、teardown_method方法# 联系:VX(NoamaNelson)# 博客:https://blog.csdn.net/NoamaNelson

import pytest

def setup_module(): print("整个.py模块开始前只执行一次")

def teardown_module(): print("整个.py模块结束后只执行一次")

def test_one(): print("用例1")

def test_two(): print("用例2")

class TestOne():
def setup_class(self): print("整个测试类开始前只执行一次")
def teardown_class(self): print("整个测试类结束后只执行一次")
def setup_method(self): print("1类里面每个用例执行前都会执行")
def teardown_method(self): print("1类里面每个用例结束后都会执行")
def test_thr(self): print("用例3")
def test_fo(self): print("用例4")

if __name__ == "__main__": pytest.main()
复制代码


  • 运行结果为:


(venv) F:\pytest_study\test_case\test_c>pytest -s -q test_pytest_setup_teardown_method.py整个.py模块开始前只执行一次用例1.用例2.整个测试类开始前只执行一次1类里面每个用例执行前都会执行用例3.1类里面每个用例结束后都会执行1类里面每个用例执行前都会执行用例4.1类里面每个用例结束后都会执行整个测试类结束后只执行一次整个.py模块结束后只执行一次
4 passed in 0.14s
复制代码

2.5 Pytest:setup、teardown 方法举例

  • 创建test_pytest_setup_teardown.py,代码如下:


# -*- coding:utf-8 -*-# 作者:NoamaNelson# 日期:2021/9/9 12:28# 文件名称:test_pytest_setup_teardown.py# 作用:验证pytest的setup、teardown方法# 联系:VX(NoamaNelson)# 博客:https://blog.csdn.net/NoamaNelson

import pytest

def setup_module(): print("setup_module:整个.py模块开始前只执行一次")

def teardown_module(): print("teardown_module:整个.py模块结束后只执行一次")

def setup_function(): print("setup_function:每个函数级别用例开始前都执行")

def teardown_function(): print("teardown_function:每个函数级别用例结束后都执行")
def test_one(): print("用例1")

def test_two(): print("用例2")

class TestOne():
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 setup(self): print("setup:类里面每个用例执行前都会执行")
def teardown(self): print("teardown:类里面每个用例结束后都会执行")
def test_thr(self): print("用例3")
def test_fo(self): print("用例4")

if __name__ == "__main__": pytest.main()
复制代码


  • 运行结果如下:


(venv) F:\pytest_study\test_case\test_c>pytest -s -q test_pytest_setup_teardown.pysetup_module:整个.py模块开始前只执行一次setup_function:每个函数级别用例开始前都执行用例1.teardown_function:每个函数级别用例结束后都执行setup_function:每个函数级别用例开始前都执行用例2.teardown_function:每个函数级别用例结束后都执行setup_class:整个测试类开始前只执行一次setup_method:类里面每个用例执行前都会执行setup:类里面每个用例执行前都会执行用例3.teardown:类里面每个用例结束后都会执行teardown_method:类里面每个用例结束后都会执行setup_method:类里面每个用例执行前都会执行setup:类里面每个用例执行前都会执行用例4.teardown:类里面每个用例结束后都会执行teardown_method:类里面每个用例结束后都会执行teardown_class:整个测试类结束后只执行一次teardown_module:整个.py模块结束后只执行一次
4 passed in 0.14s
复制代码


发布于: 刚刚阅读数: 3
用户头像

虫无涯

关注

专注测试领域各种技术研究、分享和交流~ 2019-12-11 加入

CSDN测试领域优质创作者 | CSDN博客专家 | 阿里云专家博主 | 华为云享专家 | 51CTO专家博主

评论

发布
暂无评论
pytest学习和使用4-pytest和Unittest中setup、teardown等方法详解和使用(最全)_Python_虫无涯_InfoQ写作社区