关于pytest:pytest学习和使用4pytest和Unittest中setupteardown等方法详解和使用最全

1次阅读

共计 7302 个字符,预计需要花费 19 分钟才能阅读完成。

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

  • 应用 Unittest 框架联合 selenium 做 webUI 自动化测试的时候,常常会遇到什么时候关上和敞开浏览器,这个时候就应用到了 Unittest 两种前置和两种后置办法;
  • 那具体这四种办法是什么呢?看下表:
办法 阐明
setup() 每执行一个 用例之前 执行一次,比方每次运行某个 用例前 关上一次 浏览器
teardown() 每执行一个 用例之后 执行一次,比方每次运行某个 用例后 敞开一次 浏览器
setupClass() 每执行一个 用例集之前 执行一次,比方每运行一个 testcase 前 关上一次 浏览器
teardownClass() 每执行一个 用例集之后 执行一次,比方每运行一个 testcase 后 敞开一次 浏览器
  • 而 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

OK
Launching 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 相似,然而办法更多,达到了十种,具体看下表:
办法 运行级别 阐明
setup_module() 模块 级别 整个.py 模块 开始前只执行一次, 如关上一次浏览器
teardown_module() 模块 级别 整个.py 模块 完结后只执行一次, 如敞开一次浏览器
setup_function() 函数 级别 每个函数级别 用例开始前都执行, 此办法不在类中
teardown_function() 函数 级别 每个函数级别 用例完结后都执行, 此办法不在类中
setup_class() 级别 整个测试类 开始前只执行一次, 和 Unittest 根本一样
teardown_class() 级别 整个测试类 完结后只执行一次,和 Unittest 根本一样
setup_method() 办法 级别 外面 每个 用例执行 都会执行
teardown_method() 办法 级别 外面 每个 用例完结 都会执行
setup() 办法细化 级别 外面 每个 用例执行 都会执行
teardown() 办法细化 级别 外面 每个 用例完结 都会执行

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.py
setup_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
正文完
 0