Unittest Framework 简明教程

UnitTest Framework - Py.test Module

2004 年,Holger Krekel 将其 std 包重命名为“py”(仅略微没那么容易混淆),因为该名称经常与随 Python 一起提供的标准库混淆。尽管此包包含多个子包,但直到现在,它几乎完全以其 py.test 框架而闻名。

py.test 框架为 Python 测试制定了新的标准,如今已受到许多开发者的欢迎。它为编写测试而引入的优雅且具有 Pythonic 特性的习语使得测试套件可以使用更为简洁的风格编写。

py.test 是 Python 标准 unittest 模块的无样板代码替代方案。它作为功能完备且可扩展的测试工具,其语法简洁。创建测试套件就像编写具有几个函数的模块一样简单。

py.test 可以在所有 POSIX 操作系统和 Windows (XP/7/8) 上运行,并支持 Python 2.6 及以上版本。

Installation

使用以下代码即可在当前 Python 分发中加载 pytest 模块以及 py.test.exe 实用程序。可以使用这两种方式运行测试。

pip install pytest

Usage

你可以使用 assert 语句为测试期望提供断言。pytest 的断言内省将智能地报告 assert 表达式的中间值,从而使你无需学习 JUnit legacy methods 的许多名称。

# content of test_sample.py
def func(x):
   return x + 1

def test_answer():
   assert func(3) == 5

使用以下命令行运行上述测试。运行测试后,将在控制台上显示以下结果

C:\Python27>scripts\py.test -v test_sample.py
============================= test session starts =====================
platform win32 -- Python 2.7.9, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- C:\Pyth
on27\python.exe
cachedir: .cache
rootdir: C:\Python27, inifile:
collected 1 items
test_sample.py::test_answer FAILED
================================== FAILURES =====================
_________________________________ test_answer _________________________________
   def test_answer():
>  assert func(3) == 5
E     assert 4 == 5
E     + where 4 = func(3)
test_sample.py:7: AssertionError
========================== 1 failed in 0.05 seconds ====================

还可以使用 -m 交换机和 pytest 模块从命令行运行测试。

python -m pytest test_sample.py

Grouping Multiple Tests in a Class

一旦开始拥有多个测试,通常可按逻辑将这些测试分组为类和模块。让我们编写一个包含两个测试的类

class TestClass:
   def test_one(self):
      x = "this"
      assert 'h' in x
   def test_two(self):
      x = "hello"
      assert hasattr(x, 'check')

将显示以下测试结果 −

C:\Python27>scripts\py.test -v test_class.py
============================= test session starts =====================
platform win32 -- Python 2.7.9, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- C:\Pyt
on27\python.exe
cachedir: .cache
rootdir: C:\Python27, inifile:
collected 2 items
test_class.py::TestClass::test_one PASSED
test_class.py::TestClass::test_two FAILED
================================== FAILURES =====================
_____________________________ TestClass.test_two ______________________________
self = <test_class.TestClass instance at 0x01309DA0>

   def test_two(self):
      x = "hello"
>  assert hasattr(x, 'check')
E     assert hasattr('hello', 'check')

test_class.py:7: AssertionError
===================== 1 failed, 1 passed in 0.06 seconds ======================