pytest测试框架2

pytest 参数化用例
测试登录场景

  • 测试登录成功,登录失败(账号错误,密码错误)*
  • 创建多种账号: 中⽂文账号,英⽂文账号*
    普通测试用例方法
  • Copy 多份代码 or 读⼊入参数?*
  • 一次性执⾏多个输⼊入参数*
def test_param_login_ok():
    # 登录成功
    username = "right"
    password = "right"
    login(username,password)

def test_param_login_fail():
    # 登录失败
    username = "wrong"
    password = "wrong"
    login(username,password)

参数化实现方案

  • pytest 参数化实现方法
  • 装饰器:@pytest.mark.parametrize
@pytest.mark.parametrize("username,password",[["right","right"], ["wrong","wrong"]])
def test_param(username,password):
    login(username,password)

** pytest 设置跳过、预期失败**
Mark:跳过(Skip)及预期失败(xFail)

  • skip - 始终跳过该测试用例

  • 解决 1:添加装饰器

    • @pytest.mark.skip
    • @pytest.mark.skipif
  • 解决 2:代码中添加跳过代码

    • pytest.skip(reason)
  • skipif - 遇到特定情况跳过该测试用例

  • xfail - 遇到特定情况,产生一个“期望失败”输出
    添加装饰器@pytest.mark.xfail

pytest命令行常用参数
—help
-x 用例一旦失败(fail/error),就立刻停止执行
–maxfail=num 用例达到
-m 标记用例
-k 执行包含某个关键字的测试用例
-v 打印详细日志
-s 打印输出日志(一般-vs一块儿使用)
—collect-only(测试平台,pytest 自动导入功能 )

** Python 代码执行 pytest**

  • 使用 main 函数
if __name__ == '__main__':
    # 1、运行当前目录下所有符合规则的用例,包括子目录(test_*.py 和 *_test.py)
    pytest.main()
    # 2、运行test_mark1.py::test_dkej模块中的某一条用例
    pytest.main(['test_mark1.py::test_dkej','-vs'])
    # 3、运行某个 标签
    pytest.main(['test_mark1.py','-vs','-m','dkej'])

运行方式
python test_*.py

  • 使用 python -m pytest 调用 pytest(jenkins 持续集成用到)

pytest异常处理

  • 常用的异常处理方法*
  • try…except
try:
    a = int(input("输入被除数:"))
    b = int(input("输入除数:"))
    c = a / b
    print("您输入的两个数相除的结果是:", c)
except (ValueError, ArithmeticError):
    print("程序发生了数字格式异常、算数异常之一")
except:
    print("异常未知")
print("程序继续运行")
  • 异常处理方法 pytest.raise()
import pytest


def test_raise():
    with pytest.raises(ZeroDivisionError, ValueError):
        raise ZeroDivisionError("除数为0")

def test_raise1():
    with pytest.raises(ValueError) as exc_info:
        raise ValueError("value must be 42")
    assert exc_info.type is ValueError
    assert exc_info.value.args[0] == "value must be 42"