ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

pytest学习4-测试用例setup 和teardown

2021-11-18 11:03:44  阅读:158  来源: 互联网

标签:teardown setup py pytest 用例 测试用例 test 执行


前言:

  学过unittest 的都知道里面有前置和后置 方法 setup和teardown非常好用,再每次用例开始前和结束后都去执行一次。

当然还有更高级一点的setupClass 和teardownClass,需要配合 @classmethod 装饰器一起使用,在做selenium自动化的时候,它的效率尤为突出,可以只启动一次浏览器执行多个用例。

pytest框架也有类似于setup和teardown的语法,并且不止这四个。

用例运行级别:

  -模块级别  setup_module /teardown_module  开始于模块始末,全局的

  -函数级 setup_function / teardown_function 只对函数用例生效 (不在类中)

  -类级 setup_class /teardown_class 只在类中前后运行一次(在类中)

  -方法级 setup_method / teardown_method 开始于方法始末(在类中)

  -类里面的 setup /teardown 运行在调用方法的前后

下面对这几个方法分别讲解:

  1、setup_function/ teardown_function

# !/usr/bin/env python
# -*-coding:utf-8 -*-
"""
# File       : test_setup.py
# Time       :2021/11/16 20:47
# Author     :author Kong_hua_sheng_25304
# version    :python 3.8
# Description:
"""
import pytest


def setup_function():
    print("\n setup function : 每个函数用例开始前执行此方法")


def teardown_function():
    print("\n teardown function: 每个函数用例结束后执行此方法")


def test_one():
    print(" 正在执行----testa_one")
    x = 'this'
    assert 'h' in 'this'


def test_two():
    print("正在执行----test_two")
    x = 'hello'
    assert hasattr(x, 'check')


def test_three():
    print("正在执行---test three")
    a = 'hello'
    b = 'hello world'
    assert a in b


if __name__ == '__main__':
    pytest.main(['-s', 'test_setup.py'])

  执行结果:

============================= test session starts =============================
collecting ... collected 3 items

test_setup.py::test_one
setup function : 每个函数用例开始前执行此方法
PASSED [ 33%] 正在执行----testa_one

teardown function: 每个函数用例结束后执行此方法

test_setup.py::test_two
setup function : 每个函数用例开始前执行此方法
FAILED [ 66%]正在执行----test_two

test_setup.py:26 (test_two)
def test_two():
print("正在执行----test_two")
x = 'hello'
> assert hasattr(x, 'check')
E AssertionError: assert False
E + where False = hasattr('hello', 'check')

test_setup.py:30: AssertionError

teardown function: 每个函数用例结束后执行此方法

test_setup.py::test_three
setup function : 每个函数用例开始前执行此方法
PASSED [100%]正在执行---test three

teardown function: 每个函数用例结束后执行此方法


========================= 1 failed, 2 passed in 0.12s =========================

Process finished with exit code 1

  发现执行顺序: 先执行 setup_function --》再执行 用例 1--》 结束后执行teardown_function

         先执行 setup_function --》再执行 用例 2--》 结束后执行teardown_function

         先执行 setup_function --》再执行 用例 3--》 结束后执行teardown_function

备注:-s 参数是为了显示用例的打印信息。-q 参数只显示打印结果,不显示打印过程。

2、setup_module/teardown_module

setup_module是所有用例开始前只执行一次,teardown_module 是所有用例结束后只执行一次

 

# !/usr/bin/env python
# -*-coding:utf-8 -*-
"""
# File       : test_setup.py
# Time       :2021/11/16 20:47
# Author     :author Kong_hua_sheng_25304
# version    :python 3.8
# Description:
"""
import pytest


def setup_module():
    print("\n setup module: 整个.py 模块开始只执行一次")
    print("比如 所有用例开始前 只打开一次浏览器")


def teardown_module():
    print("\n teardown_module : 整个.py模块结束 只执行一次")
    print("比如:所有用例结束,最后关闭浏览器")


def setup_function():
    print("\n setup function : 每个函数用例开始前执行此方法")


def teardown_function():
    print("\n teardown function: 每个函数用例结束后执行此方法")


def test_one():
    print(" 正在执行----testa_one")
    x = 'this'
    assert 'h' in 'this'


def test_two():
    print("正在执行----test_two")
    x = 'hello'
    assert hasattr(x, 'check')


def test_three():
    print("正在执行---test three")
    a = 'hello'
    b = 'hello world'
    assert a in b


if __name__ == '__main__':
    pytest.main(['-s', 'test_setup.py'])

  从运行结果可以看出setup_module  teardown_module 只执行了一次,运行结果如下:

============================ test session starts =============================
collecting ... collected 3 items

test_setupfunction.py::test_one 
 setup module: 整个.py 模块开始只执行一次
比如 所有用例开始前 只打开一次浏览器

 setup function : 每个函数用例开始前执行此方法
PASSED                                   [ 33%] 正在执行----testa_one

 teardown function: 每个函数用例结束后执行此方法

test_setupfunction.py::test_two 
 setup function : 每个函数用例开始前执行此方法
FAILED                                   [ 66%]正在执行----test_two

test_setupfunction.py:36 (test_two)
def test_two():
        print("正在执行----test_two")
        x = 'hello'
>       assert hasattr(x, 'check')
E       AssertionError: assert False
E        +  where False = hasattr('hello', 'check')

test_setupfunction.py:40: AssertionError

 teardown function: 每个函数用例结束后执行此方法

test_setupfunction.py::test_three 
 setup function : 每个函数用例开始前执行此方法
PASSED                                 [100%]正在执行---test three

 teardown function: 每个函数用例结束后执行此方法

 teardown_module : 整个.py模块结束 只执行一次
比如:所有用例结束,最后关闭浏览器


========================= 1 failed, 2 passed in 0.11s =========================

Process finished with exit code 1

  

备注: setup_function \teardown_function   setup_module\teardown_module 这四种方法是可以任意组合的,用一个和多个都可以

类和方法:

  1、setup\teardown  和unittest 里面的setup\teardown 是一样的功能,setup_class 和teardown_class 等价于unittest 里面的 setupClass 和 teardownClass

D:\Python\Python38\python.exe "D:\JetBrains\PyCharm Community Edition 2021.1.3\plugins\python-ce\helpers\pycharm\_jb_pytest_runner.py" --path E:/pythonProject1/learn_project/pytest_learn/test_setupmodule.py
Testing started at 10:06 ...
Launching pytest with arguments E:/pythonProject1/learn_project/pytest_learn/test_setupmodule.py --no-header --no-summary -q in E:\pythonProject1\learn_project\pytest_learn

============================= test session starts =============================
collecting ... collected 3 items

test_setupmodule.py::TestCase::test_one 
test_setupmodule.py::TestCase::test_two 
 setup_class , 每次类中的所有用例执行前 执行一次
setup_method 每个用力执行前 执行一次
setup  每个用例执行前 执行一次
PASSED                           [ 33%] 正在执行----testa_one
teardown 每个用力执行后 执行一次
teardown_method  每个用例执行后 执行一次
setup_method 每个用力执行前 执行一次
setup  每个用例执行前 执行一次
FAILED                           [ 66%]正在执行----test_two

test_setupmodule.py:38 (TestCase.test_two)
self = <test_setupmodule.TestCase object at 0x0000024D163BA670>

    def test_two(self):
        print("正在执行----test_two")
        x = 'hello'
>       assert hasattr(x, 'check')
E       AssertionError: assert False
E        +  where False = hasattr('hello', 'check')

test_setupmodule.py:42: AssertionError
teardown 每个用力执行后 执行一次
teardown_method  每个用例执行后 执行一次
setup_method 每个用力执行前 执行一次
setup  每个用例执行前 执行一次
PASSED                         [100%]正在执行---test three
teardown 每个用力执行后 执行一次
teardown_method  每个用例执行后 执行一次
teardown_class, 每次类中的所有用力执行后 执行一次



test_setupmodule.py::TestCase::test_three 

========================= 1 failed, 2 passed in 0.12s =========================

Process finished with exit code 1

  运行结果:

============================= test session starts =============================
collecting ... collected 3 items

test_setupmodule.py::TestCase::test_one 
test_setupmodule.py::TestCase::test_two 
 setup_class , 每次类中的所有用例执行前 执行一次
setup_method 每个用力执行前 执行一次
setup  每个用例执行前 执行一次
PASSED                           [ 33%] 正在执行----testa_one
teardown 每个用力执行后 执行一次
teardown_method  每个用例执行后 执行一次
setup_method 每个用力执行前 执行一次
setup  每个用例执行前 执行一次
FAILED                           [ 66%]正在执行----test_two

test_setupmodule.py:38 (TestCase.test_two)
self = <test_setupmodule.TestCase object at 0x0000024D163BA670>

    def test_two(self):
        print("正在执行----test_two")
        x = 'hello'
>       assert hasattr(x, 'check')
E       AssertionError: assert False
E        +  where False = hasattr('hello', 'check')

test_setupmodule.py:42: AssertionError
teardown 每个用力执行后 执行一次
teardown_method  每个用例执行后 执行一次
setup_method 每个用力执行前 执行一次
setup  每个用例执行前 执行一次
PASSED                         [100%]正在执行---test three
teardown 每个用力执行后 执行一次
teardown_method  每个用例执行后 执行一次
teardown_class, 每次类中的所有用力执行后 执行一次

  从执行结果可以看出:运行的优先级:setup_class > setup_method>setup > 用例执行>teardown>teardown_method>teardown_class

一般: 这里setup_method \ teardown_method 的功能和 setup / teardown 功能 是一样的,一般二者用其中一个,一般使用 setup\teardown

 

函数 和 类混合

1、如果一个.py 的文件里面 既有函数用例又有类和方法用例,运行的顺序又是什么呢??????

# !/usr/bin/env python
# -*-coding:utf-8 -*-
"""
# File       : test_hunhe.py
# Time       :2021/11/18 10:20
# Author     :author Kong_hua_sheng_25304
# version    :python 3.8
# Description:
"""
import pytest


def setup_module():
    print("\n setup_module: 整个.py模块执行前执行一次")
    pass


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


def setup_function():
    print("setup_function: 每个用力开始前都会执行")
    pass


def teardown_function():
    print("teardown_function: 每个用例结束后 都会执行")
    pass


def test_one():
    print("正在执行----test_one")
    x = "hello"
    assert 'h' in x
    pass


def test_two():
    print("正在执行 test_two")
    x = 'this'
    assert hasattr(x, 'is')
    pass


class TestCase:
    def setup(self):
        print(" setup : 类中每个用例执行前都会执行")
        pass

    def teardown(self):
        print("teardown:类中每个用例执行结束后 都会执行")
        pass

    def setup_class(self):
        print("setup_class: 类开始前执行一次")
        pass

    def teardown_class(self):
        print("teardown_class: 类结束后 执行一次")
        pass

    def test_three(self):
        print("执行测试用例 ----test_three")
        x = 'hello'
        assert 'h' in x
        pass

    def test_four(self):
        print("执行测试用例---test_four")
        x = 'this'
        assert hasattr(x, 'is')
        pass


if __name__ == '__main__':
    pytest.main(['-s','-v'])

  执行结果如下:

============================= test session starts =============================
collecting ... collected 4 items

test_hunhe.py::test_one 
 setup_module: 整个.py模块执行前执行一次
setup_function: 每个用力开始前都会执行
PASSED                                           [ 25%]正在执行----test_one
teardown_function: 每个用例结束后 都会执行

test_hunhe.py::test_two setup_function: 每个用力开始前都会执行
FAILED                                           [ 50%]正在执行 test_two

test_hunhe.py:39 (test_two)
def test_two():
        print("正在执行 test_two")
        x = 'this'
>       assert hasattr(x, 'is')
E       AssertionError: assert False
E        +  where False = hasattr('this', 'is')

test_hunhe.py:43: AssertionError
teardown_function: 每个用例结束后 都会执行

test_hunhe.py::TestCase::test_three 
test_hunhe.py::TestCase::test_four setup_class: 类开始前执行一次
 setup : 类中每个用例执行前都会执行
PASSED                               [ 75%]执行测试用例 ----test_three
teardown:类中每个用例执行结束后 都会执行
 setup : 类中每个用例执行前都会执行
FAILED                                [100%]执行测试用例---test_four

test_hunhe.py:69 (TestCase.test_four)
self = <test_hunhe.TestCase object at 0x000001B8ABD6AFD0>

    def test_four(self):
        print("执行测试用例---test_four")
        x = 'this'
>       assert hasattr(x, 'is')
E       AssertionError: assert False
E        +  where False = hasattr('this', 'is')

test_hunhe.py:73: AssertionError
teardown:类中每个用例执行结束后 都会执行
teardown_class: 类结束后 执行一次
teardown_module: 整个.py 模块执行后 执行一次

  从运行结果看出:setup_module/teardown_module 的优先级是最大的,然后函数里面用到的setup_function/teardown_function 和类中的setup_class / teardown_class 互不干涉

标签:teardown,setup,py,pytest,用例,测试用例,test,执行
来源: https://www.cnblogs.com/1050619969kong/p/15563496.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有