Jade Dungeon

Python测试工具nose

主流框架

  • unittest Python自带
  • nose / nose2
  • pytest

(1) 从入门难度看,pytest/nose优于unittest

虽然unittest是Python自带的单元测试库,但是要上手unittest是有难度的,既需要了解testrunner, testsuite, testcase等基本概念,还需要熟悉面向对象编程。而pytest/nose则为我们隐藏了这些细节,因而能够降低入门单元测试的难度。

对于有一定Python编程基础的人来说,unittest是适合的;对于Python编程基础较弱的人来说,nose和pytest则比较适合。另外,对比nose和pytest,一般认为pytest的入门难度更低。

(2) 同为第三方库,pytest的生态优于nose/nose2

我们知道,nose已经进入了维护模式,取代者是nose2。相比nose2,pytest的生态无疑更具优势,社区的活跃度也更高。

例如,在github上,截止现在,pytest的STAR数量是4229,而nose2的STAR数量是558;pytest的提交数量是10384,而nose2的提交数量是917。最重要的,pytest的插件数量是300多个,远高于nose2的20多个插件。

如果只需要基本的插件,那么nose和pytest都是适合的;如果追求单元测试更丰富的插件,那么pytest更适合。

(3) 从通用性角度看,pytest优于unittest和nose

与unittest/nose不同的是,pytest不仅能用于单元测试,还能用于更高级别的,面向应用的功能测试。因此,如果需要进行更高级别的测试,则适合采用Pytest。

安装 nose

pip3 install nose

简单例子:

from nose.tools import *
from ex48.lexicon import lexicon

def test_directions():
	assert_equal(lexicon.scan("north"), [('direction', 'north')])
	result = lexicon.scan("north south east")
	assert_equal(result, [('direction', 'north'),
		('direction', 'south'),
		('direction', 'east')])

def test_verbs():
	assert_equal(lexicon.scan("go"), [('verb', 'go')])
	result = lexicon.scan("go kill eat")
	assert_equal(result, [('verb', 'go'),
				('verb', 'kill'),
				('verb', 'eat')])

def test_stops():
	assert_equal(lexicon.scan("the"), [('stop', 'the')])
	result = lexicon.scan("the in of")
	assert_equal(result, [('stop', 'the'),
				('stop', 'in'),
				('stop', 'of')])

def test_nouns():
	assert_equal(lexicon.scan("bear"), [('noun', 'bear')])
	result = lexicon.scan("bear princess")
	assert_equal(result, [('noun', 'bear'),
		('noun', 'princess')])

def test_numbers():
	assert_equal(lexicon.scan("1234"), [('number', 1234)])
	result = lexicon.scan("3 91234")
	assert_equal(result, [('number', 3),
		('number', 91234)])

def test_errors():
	assert_equal(lexicon.scan("ASDFADFASDF"),
		[('error', 'ASDFADFASDF')])
	result = lexicon.scan("bear IAS princess")
	assert_equal(result, [('noun', 'bear'),
		('error', 'IAS'),
		('noun', 'princess')])

$ nosetests tests/ex47_tests.py                                                                                                                                                                                  ──(Fri,Sep11)─┘
...
----------------------------------------------------------------------
Ran 3 tests in 0.001s

OK