先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注软件测试)
正文
和前面介绍 unittest
和 nose
一样,我们将从如下几个方面介绍 pytest
的特性。
二、用例编写
同 nose
一样,pytest
支持函数、测试类形式的测试用例。最大的不同点是,你可以尽情地使用 assert
语句进行断言,丝毫不用担心它会在 nose
或 unittest
中产生的缺失详细上下文信息的问题。
比如下面的测试示例中,故意使得 test_upper
中断言不通过:
import pytest
def test_upper():
assert ‘foo’.upper() == ‘FOO1’
class TestClass:
def test_one(self):
x = “this”
assert “h” in x
def test_two(self):
x = “hello”
with pytest.raises(TypeError):
x + []
而当使用 pytest
去执行用例时,它会输出详细的(且是多种颜色)上下文信息:
=================================== test session starts ===================================
platform darwin – Python 3.7.1, pytest-4.0.1, py-1.7.0, pluggy-0.8.0
rootdir: /Users/prodesire/projects/tests, inifile:
plugins: cov-2.6.0
collected 3 items
test.py F… [100%]
======================================== FAILURES =========================================
_______________________________________ test_upper ________________________________________
def test_upper():
assert 'foo'.upper() == 'FOO1'
E AssertionError: assert ‘FOO’ == ‘FOO1’
E - FOO
E + FOO1
E ? +
test.py:4: AssertionError
=========================== 1 failed, 2 passed in 0.08 seconds ============================
不难看到,pytest
既输出了测试代码上下文,也输出了被测变量值的信息。相比于 nose
和 unittest
,pytest
允许用户使用更简单的方式编写测试用例,又能得到一个更丰富和友好的测试结果。
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036
三、用例发现和执行
unittest
和 nose
所支持的用例发现和执行能力,pytest
均支持。 pytest
支持用例自动(递归)发现:
- 默认发现当前目录下所有符合
test_*.py
或*_test.py
的测试用例文件中,以test
开头的测试函数或以Test
开头的测试类中的以test
开头的测试方法 - 使用
pytest
命令 - 同
nose2
的理念一样,通过在配置文件中指定特定参数,可配置用例文件、类和函数的名称模式(模糊匹配)
pytest
也支持执行指定用例:
- 指定测试文件路径
pytest /path/to/test/file.py
- 指定测试类
pytest /path/to/test/file.py:TestCase
- 指定测试方法
pytest another.test::TestClass::test_method
- 指定测试函数
pytest /path/to/test/file.py:test_function
四、测试夹具(Fixtures)
pytest
的测试夹具和 unittest
、nose
、nose2
的风格迥异,它不但能实现 setUp
和 tearDown
这种测试前置和清理逻辑,还其他非常多强大的功能。
4.1 声明和使用
pytest
中的测试夹具更像是测试资源,你只需定义一个夹具,然后就可以在用例中直接使用它。得益于 pytest
的依赖注入机制,你无需通过from xx import xx
的形式显示导入,只需要在测试函数的参数中指定同名参数即可,比如:
import pytest
@pytest.fixture
def smtp_connection():
import smtplib
return smtplib.SMTP(“smtp.gmail.com”, 587, timeout=5)
def test_ehlo(smtp_connection):
response, msg = smtp_connection.ehlo()
assert response == 250
上述示例中定义了一个测试夹具 smtp_connection
,在测试函数 test_ehlo
签名中定义了同名参数,则 pytest
框架会自动注入该变量。
4.2 共享
在 pytest
中,同一个测试夹具可被多个测试文件中的多个测试用例共享。只需在包(Package)中定义 conftest.py
文件,并把测试夹具的定义写在该文件中,则该包内所有模块(Module)的所有测试用例均可使用 conftest.py
中所定义的测试夹具。
比如,如果在如下文件结构的 test_1/conftest.py
定义了测试夹具,那么 test_a.py
和 test_b.py
可以使用该测试夹具;而 test_c.py
则无法使用。
-- test_1 | |-- conftest.py |
– test_a.py
| -- test_b.py
– test_2
`-- test_c.py
4.3 生效级别
unittest
和 nose
均支持测试前置和清理的生效级别:测试方法、测试类和测试模块。
pytest
的测试夹具同样支持各类生效级别,且更加丰富。通过在 pytest.fixture 中指定 scope
参数来设置:
- function —— 函数级,即调用每个测试函数前,均会重新生成 fixture
- class —— 类级,调用每个测试类前,均会重新生成 fixture
- module —— 模块级,载入每个测试模块前,均会重新生成 fixture
- package —— 包级,载入每个包前,均会重新生成 fixture
- session —— 会话级,运行所有用例前,只生成一次 fixture
当我们指定生效级别为模块级时,示例如下:
import pytest
import smtplib
@pytest.fixture(scope=“module”)
def smtp_connection():
return smtplib.SMTP(“smtp.gmail.com”, 587, timeout=5)
4.4 测试前置和清理
pytest
的测试夹具也能够实现测试前置和清理,通过 yield
语句来拆分这两个逻辑,写法变得很简单,如:
import smtplib
import pytest
@pytest.fixture(scope=“module”)
def smtp_connection():
smtp_connection = smtplib.SMTP(“smtp.gmail.com”, 587, timeout=5)
yield smtp_connection # provide the fixture value
print(“teardown smtp”)
smtp_connection.close()
在上述示例中,yield smtp_connection
及前面的语句相当于测试前置,通过 yield
返回准备好的测试资源 smtp_connection
; 而后面的语句则会在用例执行结束(确切的说是测试夹具的生效级别的声明周期结束时)后执行,相当于测试清理。
如果生成测试资源(如示例中的 smtp_connection
)的过程支持 with
语句,那么还可以写成更加简单的形式:
@pytest.fixture(scope=“module”)
def smtp_connection():
with smtplib.SMTP(“smtp.gmail.com”, 587, timeout=5) as smtp_connection:
yield smtp_connection # provide the fixture value
pytest
的测试夹具除了文中介绍到的这些功能,还有诸如参数化夹具、工厂夹具、在夹具中使用夹具等更多高阶玩法,详情请阅读 “pytest fixtures: explicit, modular, scalable”。
五、跳过测试和预计失败
pytest
除了支持 unittest
和 nosetest
的跳过测试和预计失败的方式外,还在 pytest.mark
中提供对应方法:
- 通过 skip 装饰器或 pytest.skip 函数直接跳过测试
- 通过 skipif按条件跳过测试
- 通过 xfail 预计测试失败
示例如下:
@pytest.mark.skip(reason=“no way of currently testing this”)
def test_mark_skip():
…
def test_skip():
if not valid_config():
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
alid_config():
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-1k5iK4IQ-1713473062588)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!