自动化测试神器:Python之Pytest库入门使用

本文写作思路和建议:

1、本文从Python的Pytest库基本安装使用开始讲起,详细说明pytest如何操作,如何快速入门?

2、同时说明了pytest的常用特性,如何在自动化测试中进行应用,达到应有的测试效率?

3、建议:阅读本文基本可以掌握Pytest的用法,另外学习的时候建议和Unittest库进行对比着使用,将会达到更好的效果。

1 pytest简介、安装和用例运行

1.1 pytest简介

pytest是Python的一个单元测试框架,与python自带的unittest测试框架类似;

pytest比unittest框架使用起来更简洁,效率更高,而且特性比较多,也就非常的灵活;

比如pytest常用的特性有:

① 对case可以进行设置跳过,也可以进行标记(比如失败等);

② 可以重复执行失败的case;

③ 可以兼容执行unittest编写的case;

④ 有很多第三方的插件,比如报告allure等;

⑤ 支持持续集成;

⑥ 和unittest一样支持参数化,但Pytest方法更多,更灵活;

。。。

1.2 Pytest安装

直接使用命令即可:

pip install -U pytest

可以使用以下命令查看pytest的版本号:

pip show pytest

需要注意的是,pytest对于Python版本是有要求的,目前最新版本的pytest需要Python在3.8及以上版本。

1.3 pytest如何运行用例?

首先看下pytest运行用例规则:

A、文件名规则:**test_*.py和 *_test.py命名的函数;

B、函数名规则:**以test_开头的函数;

C、python包的规则:**同python一样,包需要有__init__.py文件;

D、静默运行:**以-q或-quiet参数进行静默运行函数;

运行方式:

1、通过文件名去运行,比如在代码中加if__name **== ‘**main__’:pytest.main(“-s”, “test_mm.py”);

2、通过命令行调用运行,直接用pytest -s test_mm.py;

3、直接匹配某个目录下所有符合规则的case去运行,比如pytest -vs,或者将规则写入pytest.ini文件中。

举个例子看下运行效果,以下脚本命名为test_mm.py:

# test_mm.py

# -*- coding:utf-8 -*-


import pytest


class TestClass:


def test_you(self):

y = "you"

assert "y" in y


def test_hai(self):

h = "hai"

assert "gg" not in h



if __name__ == '__main__':

pytest.main(["-s", "test_mm.py"])


# 输出:

# test_mm1.py ..

# ============================== 2 passed in 0.08s ==============================

2 pytest的setup、teardown特性

pytest前置和后置就是告诉用例运行前应该做啥,运行完后应该做啥;

和unittest有一些方法是一样的;

pytest有十种前置和后置方法:

在这里插入图片描述

咱们来看一个示例,文件命名为test_set_tear.py:

# -*- coding:utf-8 -*-


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(["-s", "test_set_tear.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
3 pytest如何进行用例断言?

pytest中的断言就使用assert即可;

pytest的常用断言方式有以下几种:

在这里插入图片描述看一个示例,把以下脚本命名为

test_assert.py:

# -*- coding:utf-8 -*-


import pytest


class TestU():


def test_f(self):

a = 3

b = 4

s = a + b

return s


def test_func(self):

assert self.test_f() == 7, "计算结果不是7"


if __name__ == "__main__":

pytest.main(["-s", "test_assert.py"])


# 输出为:

# test_assert.py .. [100%]

# ================== 2 passed in 0.31s ====================
4 pytest中的fixture特性
4.1 fixture简介

和setup、teardown的区别是:fixture可自定义测试用例的前置条件

setup、teardown针对整个脚本全局生效,可实现在执行用例前后加入一些操作;

setup、teardown不能做到灵活使用,比如用例A先登陆,用例B不需要登陆,用例C需要登陆,这样使用fixture更容易实现功能。

4.2 fixture参数

参数原型:fixture(scope=“function”, params=None, autouse=False, ids=None, name=None):

关于参数解释如下:

在这里插入图片描述

4.3 示例说明

关于用法直接参考上边的参数说明即可;

这里我们用一个例子来进行说明,以下代码写入脚本test_mfixture.py:

# -*- coding:utf-8 -*-


import pytest


# 不带参数时默认scope="function"

@pytest.fixture

def case():

print("这个是登陆功能!")


def test_one(case):

print("用例1需要登陆,然后进行操作one")


def test_two():

print("用例2不需要登陆,直接操作two")


@pytest.fixture

def case1():

print("输入验证码")


def test_three(case):

print("用例3需要登陆,然后操作three")


@pytest.mark.usefixtures("case", "case1")

def test_four(case1):

print("先登录,再输入验证码,最后操作four")


@pytest.fixture(autouse=True)

def case2():

print("所有用例都会调用case2")


if __name__ == "__main__":

pytest.main(["-s", "test_mfixture.py"])


# 输出为:

# test_mfixture.py::test_one 所有用例都会调用case2

# 这个是登陆功能!

#PASSED [ 25%]用例1需要登陆,然后进行操作one


#test_mfixture.py::test_two 所有用例都会调用case2

#PASSED [ 50%]用例2不需要登陆,直接操作two


#test_mfixture.py::test_three 所有用例都会调用case2

# 这个是登陆功能!

#PASSED [ 75%]用例3需要登陆,然后操作three


#test_mfixture.py::test_four 所有用例都会调用case2

# 这个是登陆功能!

# 输入验证码

#PASSED [100%]先登录,再输入验证码,最后操作four


#=========== 4 passed in 0.03s ==========
5 pytest如何跳过用例执行?

在Pytest中也提供了两种方式进行用例的跳过 skip、skipif;

pytest.skip()不同于pytest.mark.skip,pytest.mark.skip是作用于整个测试用例;而 pytest.skip()是测试用例执行期间强制跳过不再执行剩余内容;

和Python中break 跳出循环类似。

一个示例简单说明下,脚本命名为test_pytest_skip1.py:

# -*- coding:utf-8 -*-


import pytest

import time


@pytest.fixture()

def start():

print("打开浏览器,输入用户名和密码登陆")

yield

print("关闭浏览器")


def test_1(start):

print("用例1......")

i = 1

while True:

print(time.time())

i += 1

if i == 6:

pytest.skip("打印5次时间后,第六次不再打印了~")


if __name__ == '__main__':

pytest.main(["-s", "test_pytest_skip1.py"])


# 输出为:

# test_pytest_skip1.py::test_1 打开浏览器,输入用户名和密码登陆

# SKIPPED (打印5次时间后,第六次不再打印了~) [100%]用例1......

# 1668677189.0525532

# 1668677189.0525532

# 1668677189.0525532

# 1668677189.0525532

# 1668677189.0525532


# Skipped: 打印5次时间后,第六次不再打印了~

# 关闭浏览器



# ======== 1 skipped in 0.02s ===========
6 pytest的mark特性

pytest可自定义标记,即进行mark;

作用是把一个大项目自动化用例,划分多个模块,标明哪些是模块A用例,哪些是模块B的,运行代码时候指定mark名称运行就可以;

使用方法为:

@pytest.mark.自定义名称

一个示例,脚本为test_mark.py:

# -*- coding:utf-8 -*-


import pytest


@pytest.mark.login

def test_login():

print("用户登陆")


@pytest.mark.case_a

def test_case_a():

print("执行用例a")


@pytest.mark.case_b

def test_case_b():

print("执行用例b")


@pytest.mark.quit

def test_quit():

print("用户退出")

运行规则如下:

1、运行一个标记:pytest -s -m login test_mark.py;

2、运行多个标记:pytest -s -m “login or case_a or case_b or quit” test_mark.py;

3、不运行某个标记,直接取反即可:pytest -s -m “not quit” test_mark.py

7 pytest参数化如何使用?

pytest允许在多个级别启用测试参数化;

pytest.fixture() 允许fixture有参数化功能;@pytest.mark.parametrize 允许在测试函数或类中定义多组参数和fixtures;pytest_generate_tests 允许定义自定义参数化方案或扩展。

7.1 parametrize方法

参数说明:

parametrize(argnames, argvalues, indirect=False, ids=None, scope=None);

在这里插入图片描述

7.2 使用方法

示例如下,脚本为test_pytest_parametrize.py:

# -*- coding:utf-8 -*-

import pytest


@pytest.mark.parametrize("num, result", [("10 + 10", 20),

("30 - 10", 20),

("4 * 5", 20),

("40 / 2", 20)])

def test_case(num, result):

print(f"num:{num}")

print(f"result:{result}")

assert eval(num) == result


if __name__ == '__main__':

pytest.main(["-s", "test_pytest_parametrize.py"])


# 输出为:

# test_pytest_parametrize.py

# num:10 + 10

# result:20

# .

# num:30 - 10

# result:20

# .

# num:4 * 5

# result:20

# .

# num:40 / 2

# result:20

# .
8 总结及说明

除了以上提及的,pytest还有其他很多特性,或者很多第三方插件,这里不再赘述了,比如有:

用例失败重跑可以使用插件pytest-rerunfailures来实现;

pytest-HTML是一个插件,pytest用于生成测试结果的HTML报告;

为了重复执行用例,我们可以使用pytest-repeat插件;

pytest.ini是一个固定的文件,用来读取配置信息;

使用pytest-assume插件来解决多重断言;

pytest-xdist插件可以让自动化测试用例分布式执行,节省测试时间,属于进程级别的并发;

allure-pytest插件可以生成完美的自动化可视化报告。

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

​​​软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值