zoukankan      html  css  js  c++  java
  • Python单元测试框架:pytest

    (一)介绍

      pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点:

    1、简单灵活,容易上手;

    2、支持参数化;

    3、能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests);

    4、pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等;

    5、测试用例的skip和xfail处理;

    6、可以很好的和jenkins集成;

    (二)安装

      pip install -U pytest   # 通过pip安装

      pip install -U pytest-html

      pip install -U pytest-rerunfailures

      py.test --version        # 查看pytest版本

           This is pytest version 2.7.2, imported from C:Python27libsite-packagespytest.pyc

    此外还有很多很好的第三方插件,请到http://plugincompat.herokuapp.com/ 和 https://pypi.python.org/pypi?%3Aaction=search&term=pytest-&submit=search 查找

    (三)例子

    这里列几个pytest-document中的例子

    1、默认执行当前目录下的所有以test_为前缀(test_*.py)或以_test为后缀(*_test.py)的文件中以test_为前缀的函数

    import pytest
    
    # content of test_sample.py
    def func(x):
        return x + 1
    def test_answer():
        assert func(3) == 5

    运行 py.test  或 指定特定文件 py.test -q test_sample.py

    2、使用类来组成多个用例的

    import pytest
    
    # content of test_class.py
    class TestClass:
        def test_one(self):
    
            x = "this"
        assert 'h' in x
        def test_two(self):
            x = "hello"
            assert hasattr(x, 'check')

    3、在python中调用pytest: python test_class.py

    import pytest
    
    # content of test_class.py
    class TestClass:
        def test_one(self):
            print 'one'
            x = "this"
            assert 'h' in x
        def test_two(self):
            print 'two'
            x = "hello"
            assert hasattr(x, 'check')
    if __name__ == '__main__':
        pytest.main("-q --html=a.html")

    4、来个支持参数化的例子,参数化使用pytest.mark.parametrize的参数,第一个为变量的元组,第二个是变量赋值的元组列表,具体下面的章节会仔细介绍

    # content of test_time.py
    import pytest
    from datetime import datetime, timedelta
    
    testdata = [
    (datetime(2001, 12, 12), datetime(2001, 12, 11), timedelta(1)),
    (datetime(2001, 12, 11), datetime(2001, 12, 12), timedelta(-1)),
    ]
    
    @pytest.mark.parametrize("a,b,expected", testdata)
    def test_timedistance_v0(a, b, expected):
        diff = a - b
        assert diff == expected
        
    @pytest.mark.parametrize("a,b,expected", testdata, ids=["forward", "backward"])
    def test_timedistance_v1(a, b, expected):
    
        diff = a - b
        assert diff == expected
        
    def idfn(val):
        if isinstance(val, (datetime,)):
        # note this wouldn't show any hours/minutes/seconds
            return val.strftime('%Y%m%d')
    @pytest.mark.parametrize("a,b,expected", testdata, ids=idfn)
    def test_timedistance_v2(a, b, expected):
        diff = a - b
        assert diff == expected

  • 相关阅读:
    C#
    C#
    ssh学习笔记
    (已解决)Could not open '/var/lib/nova/mnt/*/volume-*': Permission denied
    RPCVersionCapError: Requested message version, 4.17 is incompatible. It needs to be equal in major version and less than or equal in minor version as the specified version cap 4.11.
    如何在linux下安装idea
    The system has no LUN copy license
    调整mysql数据库最大连接数
    mysql数据库编码问题
    cinder支持nfs快照
  • 原文地址:https://www.cnblogs.com/yaoteng/p/10979024.html
Copyright © 2011-2022 走看看