PyTest入门

2018 年 8 月 17 日 Python程序员

Pytest是我首选的Python测试库。它使简单的测试非常容易编写,它拥有许多高级的功能 (和众多插件),有助于更高级的测试方案。

为了演示基本功能,我打算使用py.test演示在测试驱动风格下解决cryptopals challenges的第一集合的第一题。

注意︰

我要去做的第一个的挑战和也许涉及到第二个。如果你想自己测试,可以在阅读这篇文章的其余部分之前这样做。

安装和第一个测试

安装︰

注意

我使用 Python 3.5,并且所有的操作在virtualenv。如果你没有安装Python,或不知道如何使用 pip 和virtualenv ,看看Python部落影音学堂中<0基础1小时入门Python>的第一课。

第一个挑战要求我们把一个十六进制编码的字符串转化为Base64编码。我先编写测试,代表所面临的挑战。 py.test默认检查以test_*.py命名的文件名,在文件内部查找以test_打头的方法或函数,并执行它们。 所以我创建文件test_set1.py︰

我没弄错吧?

是的,我并没有写任何代码︰ 第一个挑战超级简单,Python可以使用bytes.fromhex将十六进制编码的字符串解析成bytestring,并且base64模块中有base64 encoding编码。

然而,这只是演示了Pytest的简单部分,测试的只是以test_打头的函数或方法,仅仅使用了简单的assert语句,而不是一系列断言方法(assertEqual, assertNotEqual, assertAlmostEqual)。

接下来是更真实的测试情况

来看一个更完整的示例,第二个挑战是要实现一个函数,异或两个固定长度的缓冲区。我会先写以下测试用例︰

运行测试:

如所料,出现错误——测试程序试图导入cryptopals模块,然而我并未创建这个模块。这个错误看起来不同于失败的测试,因为这发生在pytest调用”collection”阶段,pytest遍历你的文件,寻找测试模块(命名为test_whatever.py的文件)和测试方法(def test_whatever())。更多关于pytest如何发现测试用例(以及如何自定义测试),请参见

conventions for Python test discovery。

现在我主要来演示什么是失败的测试。在cryptopals.py中:

不出所料,失败了:

(我使用-q即—quiet,简化输出。)

我喜欢这种高亮显示测试失败行的方式,并且显示了断言语句运行的值。

一旦我写了正确的代码(在这里忽略继续挑战的精神吧),应该会看到以下输出:

尝试更高级的pytest:参数化测试函数

对于最后一个例子,来看一下pytest稍微复杂的应用。我想写更多的测试来检查我的fixed_xor函数作用于不同长度的bytestrings。这个挑战只是说此函数应该使用两个相同长度的缓冲区,,但并没有指定当两个缓冲区长度不同时会发生什么。所以,我决定这种情况下结果应该是长度最短的bytestring(主要是因为这使函数写起来简单些)。

为了正确的验证,我测试以下几种不同场景:bs1长度小于 bs2即len(bs2)<len(bs1),还有bs1或bs2为空的情况,——这种极端的测试用例往往都是bug潜伏的地方。我可以写四个更多的测试函数,但这就会重复,所以我会改为使用参数化的测试函数:

这是使用pytest高级功能的常见模式:使用装饰器注释或修改测试函数。这里装饰器让我可以指定要传递给测试函数的参数列表;然后测试函数会为每个参数集运行一次。注意在运行测试时,会发生什么:

test_chanllenge2_mismatching_lengths并不是作为一个单一的测试显示,我们看到五个测试——对应于每个示例。因为每组参数显示为单独的情况,如果我特意加入一个失败的例子,将只看到那个失败,并能明确知道是什么:

pytest还有许多细节— — 有不同的方式可以方便地管理setup/teardow场景,在不同的测试模块之间共享资源,多种选择用于组织和生成测试代码,进行分组和标记测试的方式,等等。它使编写测试代码轻松、 愉快。我希望你去看看 !


英文原文:https://jacobian.org/writing/getting-started-with-pytest/
译者:flqzdzxx


登录查看更多
0

相关内容

Python是一种面向对象的解释型计算机程序设计语言,在设计中注重代码的可读性,同时也是一种功能强大的通用型语言。
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
198+阅读 · 2020年6月29日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
239+阅读 · 2020年5月21日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
164+阅读 · 2020年5月14日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
122+阅读 · 2020年5月10日
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
182+阅读 · 2020年1月1日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
88+阅读 · 2019年11月25日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
167+阅读 · 2019年10月28日
Python 3.8.0来了!
数据派THU
5+阅读 · 2019年10月22日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
Python 如何快速入门?
全球人工智能
6+阅读 · 2018年3月15日
【入门】数据分析六部曲
36大数据
18+阅读 · 2017年12月6日
Python NLP入门教程
计算机与网络安全
9+阅读 · 2017年11月21日
TensorFlow实现神经网络入门篇
机器学习研究会
10+阅读 · 2017年11月19日
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
Python NLP 入门教程
开源中国
14+阅读 · 2017年10月1日
十五条有用的Golang编程经验
CSDN大数据
5+阅读 · 2017年8月7日
Python 书单:从入门到……
Linux中国
40+阅读 · 2017年8月6日
Meta-Learning to Cluster
Arxiv
17+阅读 · 2019年10月30日
Object Detection in 20 Years: A Survey
Arxiv
48+阅读 · 2019年5月13日
A Probe into Understanding GAN and VAE models
Arxiv
9+阅读 · 2018年12月13日
Knowledge Based Machine Reading Comprehension
Arxiv
4+阅读 · 2018年9月12日
Arxiv
3+阅读 · 2018年2月24日
VIP会员
相关VIP内容
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
198+阅读 · 2020年6月29日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
239+阅读 · 2020年5月21日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
164+阅读 · 2020年5月14日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
122+阅读 · 2020年5月10日
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
182+阅读 · 2020年1月1日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
88+阅读 · 2019年11月25日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
167+阅读 · 2019年10月28日
相关资讯
Python 3.8.0来了!
数据派THU
5+阅读 · 2019年10月22日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
Python 如何快速入门?
全球人工智能
6+阅读 · 2018年3月15日
【入门】数据分析六部曲
36大数据
18+阅读 · 2017年12月6日
Python NLP入门教程
计算机与网络安全
9+阅读 · 2017年11月21日
TensorFlow实现神经网络入门篇
机器学习研究会
10+阅读 · 2017年11月19日
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
Python NLP 入门教程
开源中国
14+阅读 · 2017年10月1日
十五条有用的Golang编程经验
CSDN大数据
5+阅读 · 2017年8月7日
Python 书单:从入门到……
Linux中国
40+阅读 · 2017年8月6日
相关论文
Meta-Learning to Cluster
Arxiv
17+阅读 · 2019年10月30日
Object Detection in 20 Years: A Survey
Arxiv
48+阅读 · 2019年5月13日
A Probe into Understanding GAN and VAE models
Arxiv
9+阅读 · 2018年12月13日
Knowledge Based Machine Reading Comprehension
Arxiv
4+阅读 · 2018年9月12日
Arxiv
3+阅读 · 2018年2月24日
Top
微信扫码咨询专知VIP会员