zoukankan      html  css  js  c++  java
  • Pytest:Pytest测试框架基本使用

    pytest介绍

    pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点:
    1、简单灵活,容易上手,文档丰富;
    2、支持参数化,可以细粒度地控制要测试的测试用例;
    3、能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests);
    4、pytest具有很多第三方插件,并且可以自定义扩展
    如pytest-selenium(集成selenium)、
    pytest-html(完美html测试报告生成)、
    pytest-rerunfailures(失败case重复执行)、
    pytest-xdist(多CPU分发)、
    pytest--ordering(控制测试运行的顺序)
    5、测试用例的skip和xfail处理;
    6、可以很好的和CI工具结合,例如jenkins

    编写规则:

    • 测试文件以test_开头(以_test结尾也可以)
    • 测试类以Test开头,并且不能带有 init 方法
    • 测试函数以test_开头
    • 断言使用基本的assert即可

    快速示例

     test_pyexample.py

    import pytest
    
    class TestClass:
            def test_one(self):
                x = "this"
                assert 'h' in x
    
            def test_two(self):
                x = "hello"
                assert hasattr(x, 'check')
    
            def test_three(self):
                a = "hello"
                b = "hello world"
                assert a in b

    通过命令行运行:

    1、cd 到代码所在的目录,执行命令:py.test test_pyexample.py

    2、安装pytest-sugar插件可以看到进度条

    Pycharm配置运行:

    1.file->Setting->Tools->Python Integrated Tools->项目名称->Default test runner->选择py.test

    import pytest
    
    class TestClass:
            def test_one(self):
                x = "this"
                assert 'h' in x
    
            def test_two(self):
                x = "hello"
                assert hasattr(x, 'check')
    
            def test_three(self):
                a = "hello"
                b = "hello world"
                assert a in b
    
    if __name__ == "__main__":
        pytest.main('-q test_class.py')
    Console常用参数介绍:
    -v 用于显示每个测试函数的执行结果
    -q 只显示整体测试结果
    -s 用于显示测试函数中print()函数输出
    -x, --exitfirst, exit instantly on first error or failed test
    -m 只运行带有装饰器配置的测试用例
    -h 帮助
    py.test # run all tests below current dir
    py.test test_mod.py # run tests in module file test_mod.py
    py.test somepath # run all tests below somepath like ./tests/
    py.test -k stringexpr # only run tests with names that match the
    # the "string expression", e.g. "MyClass and not method"
    # will select TestMyClass.test_something
    # but not TestMyClass.test_method_simple
    py.test test_mod.py::test_func # only run tests that match the "node ID",
    # e.g "test_mod.py::test_func" will be selected
    # only run test_func in test_mod.py

    pytest参数化

    使用装饰器:@pytest.mark.parametrize()

    单个参数:

    import pytest
    import random
     
    @pytest.mark.parametrize('x',[(1),(2),(6)])
     
    def test_add(x):
        print(x)
        assert  x==random.randrange(1,7)

    多个参数:

    import pytest
     
    @pytest.mark.parametrize('x,y',[
        (1+2,3),
        (2-0,1),
        (6*2,12),
        (10*2,3),
        ("test","test"),
    ])
     
    def test_add(x,y):   #必须与上面保持一致,只能用x,y不能用其他字母
     
        assert  x==y

    控制测试运行顺序

    安装pytest-ordering

    pip install pytest-ordering

    借助于装饰器@pytest.mark.run(order=1)控制测试运行的顺序

    import pytest
    import time
     
    value=0
    @pytest.mark.run(order=2) #后执行order=2
    def test_add2():
        print("I am 2")
        time.sleep(2)
        assert value==10
     
    @pytest.mark.run(order=1)   #先执行order=1
    def test_add():
        print("I am add")
        global value
        value=10
        assert value==10

    运行后生成测试报告(htmlReport)

    安装pytest-html:

    pip install -U pytest-html

    如何使用:

    py.test test_pyexample.py --html=report.html

    更详细的测试报告

    安装 pytest-cov:

    pip install pytest-cov 

    如何使用

    py.test --cov-report=html --cov=./ test_code_target_dir
    Console参数介绍
    --cov=[path], measure coverage for filesystem path (multi-allowed), 指定被测试对象,用于计算测试覆盖率
    --cov-report=type, type of report to generate: term, term-missing, annotate, html, xml (multi-allowed), 测试报告的类型
    --cov-config=path, config file for coverage, default: .coveragerc, coverage配置文件
    --no-cov-on-fail, do not report coverage if test run fails, default: False,如果测试失败,不生成测试报告
    --cov-fail-under=MIN, Fail if the total coverage is less than MIN. 如果测试覆盖率低于MIN,则认为失败

    多进程运行

    安装pytest-xdist:

    pip install -U pytest-xdist
     

    如何使用:

    py.test test_pyexample.py -n NUM
     

    其中NUM填写并发的进程数。

    重新运行失败的用例

    安装pytest- rerunfailures:

    import random
     
    def add(x,y):
        return x+y
     
    def test_add():
        random_value=random.randint(2,7)
        print('random_value:'+str(random_value))
        assert add(1,3)==random_value

    如何使用:

    命令:pytest --reruns 重试次数
      比如:pytest --reruns 3  表示:运行失败的用例可以重新运行3次
    命令:pytest --reruns 重试次数 --reruns-delay 次数之间的延时设置(单位:秒)     
      比如:pytest --reruns 3 --reruns-delay 5  表示:(译:瑞软四、地类)运行失败的用例可以重新运行3次,第一次和第二次的间隔时间为5秒钟

    另外也可以通过装饰器的方式配置:

    @pytest.mark.flaky(reruns=3, reruns_delay=5)
  • 相关阅读:
    jqueryuidatepicker 可控制是否显示时分秒
    JQuery zTree v3.2和demo
    模拟网易163写的一个文本框触发效果
    不刷新页面,切换CSS文件
    Devs开源规则引擎介绍
    坑爹啊!!!win2003 x64企业版不支持tfs2010的源代码管理服务
    gui设计禁忌2.0读书笔记
    c#关于数据库自定义类型在存储过程中返回服务器端的问题
    vs2010 sp1在win2003不能安装的问题
    mysql真是不错!
  • 原文地址:https://www.cnblogs.com/-wenli/p/13953634.html
Copyright © 2011-2022 走看看