¹ØÓÚunittestÄ£¿é
unittestÊÇpython·¢ÐаæÀïÃæ×Ô´øµÄÒ»¸öÄ£¿é£¬Ê¹ÓÃÆðÀ´·Ç³£¼òµ¥£¬ÎªÁËÄܹ»¸üºÃµÄÀí½âºÍʹÓÃunittestÄ£¿é£¬±ØÐëÁ˽âÒ»ÏÂһЩ»ù±¾µÄ¸ÅÄî¡£
unittestÄ£¿éÊÇÓÃÀ´½øÐе¥Ôª²âÊÔµÄÒ»¸öÄ£¿é¡£
¹ØÓÚ¸ÃÄ£¿é£¬Óм¸¸öÀà±ØÐëÀí½â¡£
TestCaseÀࣺ¸ÃÀàÊÇ·â×°ÁËÒ»¸ö²âÊÔÓÃÀý£¬¼´Ã¿¸ö²âÊÔÓÃÀý¶ÔÓ¦ÓÚÒ»¸öTestCaseÀà¡£
TestSuiteÀࣺ¸ÃÀàÊÇÒ»¸ö²âÊÔ¼¯£¬¼´°ÑÏà¹ØµÄTestCaseÀ༯ºÏµ½Ò»ÆðÐγÉÒ»¸öTestSuite
TestLoaderÀà:¸ÃÀฺÔðËÑË÷ºÍ×°ÔØTestCaseµ½TestSuiteÖС£
TextTestRunnerÀࣺ¸ÃÀฺÔðÔËÐвâÊÔÓÃÀý¡£
TextTestResultÀࣺ¸ÃÀฺÔð´æ´¢²âÊÔÓÃÀýµÄÖ´Ðнá¹û¡£
×îºóËùÓеÄÒÔÉÏÀà¶¼¼¯³ÉÔÚÁËunittest.main(£©Ä£¿éÖÐÁË¡£
Àí½âÁËÕâЩ»ù±¾¸ÅÄîÖ®ºó£¬À´¿´Ò»¸öºÜ¼òµ¥µÄÀý×Ó£¨¹Ù·½ÎĵµÖеÄÀý×Ó£©
import unittest
class TestStringMethods(unittest.TestCase):
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
# check that s.split fails when the separator
is not a string
with self.assertRaises(TypeError):
s.split(2)
if __name__ == '__main__':
unittest.main() |
ÉÏÊöÕâ¸öÀý×ÓºÜÃ÷È·µÄ¸æËßÁËÎÒÃÇunittestµÄʹÓ÷½·¨¡£unittestÖеIJâÊÔº¯Êý±ØÐë×÷Ϊijһ¸öÀàµÄ³ÉÔ±º¯Êý²¢Í¨³£ÒÔ¡°test_¡±Ç°×º¿ªÍ·£¬¸ÃÀà±ØÐëÊÇTestCaseµÄ×ÓÀ֮࣬ºóÖ´ÐÐunittest.main()º¯Êý£¬¸ÃÄ£¿é¾Í»á×Ô¶¯·âװÿһ¸öÒÔ¡°test_¡±Ç°×º¿ªÍ·
µÄÀý×Óµ½Ò»¸öTestCaseÀàÖУ¬È»ºó°ÑËùÓеÄTestCase¶¼×°Ôص½TestSuiteÖв¢ÓÉTextTestRunner¸ºÔðÖ´ÐС£ÔËÐÐһϿÉÒÔ¿´µ½ÈçϽá¹û£º

unittestÄ£¿é»¹ÌṩÁËһЩÃüÁîÐÐÓ¦Óõļòµ¥ÃüÁÁоÙһЩ³£ÓõÄÈçÏÂ:
²âÊÔÌØ¶¨Ä£¿é£º
python -m unittest Testmodule_name
²âÊÔÌØ¶¨Ä£¿éÖеÄij¸öÀࣺ
python -m unittest Testmodule_name.TestClass
²âÊÔÌØ¶¨Ä£¿éij¸öÀàÖеÄij¸ö·½·¨£º
python -m unittest Testmodule_name.TestClass.TestMethod
ÁоٿÉÓõÄÃüÁîÐÐÑ¡Ï
python -m unittest -h
²âÊÔ¸ÃÄ£¿é£¬²¢ÏÔʾִÐÐÁ˵IJâÊÔ·½·¨£º
python -m unittest -v Testmodule_name
²âÊÔµ±Ç°Ä¿Â¼ÏµÄËùÓвâÊÔÓÃÀý£º
python -m unittest
×îºóÒ»¸öÒªÌáµÄ¾ÍÊÇunittestµÄskipºÍexpectedFailureÊôÐÔ¡£¿ÉÒÔ¿´¼¸¸öСÀý×Ó¡£
Ìø¹ý¸Ã²âÊÔº¯Êý£¬²¢ÇÒÏÔʾ¡±demonstrating skipping¡±µÄÌáʾ
@unittest.skip("demonstrating
skipping")
def test_nothing(self):
self.fail("shouldn't happen") |
ÔÚÂú×ãÌØ¶¨µÄÌõ¼þÏÂÌø¹ý¸Ã²âÊÔÓÃÀý£º
@unittest.skipIf(mylib.__version__
< (1, 3), "not supported in this library
version")
def test_format(self):
# Tests that work for only a certain version of
the library.
pass |
¸Ã²âÊÔÓÃÀý±ê¼ÇΪʧ°ÜµÄ£¬ÔÚ¼ÆËã²âÊÔ²»Í¨¹ýµÄ²âÊÔÓÃÀýµÄʱºò²»Óÿ¼ÂÇ£º
@unittest.expectedFailure
def test_fail(self):
self.assertEqual(1, 0, "broken") |
¹ØÓÚunittest¸üÏêϸµÄ½éÉÜ¿ÉÒԲο¼
unittest²Î¿¼Îĵµ
¹ØÓÚpytestÄ£¿é
pytestÊÇpython³£ÓõÄÒ»¸ö²âÊÔ¿ò¼Ü£¬ ¿ÉÒÔ°ïÖúÎÒÃÇÍê³É´Óµ¥Ôª²âÊÔµ½¸´ÔӵŦÄܲâÊÔµÈһϵÁй¦ÄÜ£¬Í¬Ê±pytestºÍÆäËûµÄ²âÊÔ¹¤¾ßºÍ²âÊÔ·½·¨µÄ¼¯³ÉµÄºÜºÃ£¬·Ç³£ÈÝÒ×°²×°ºÍʹÓòå¼þ¡£×ÜÖ®£¬pytestÊÇÒ»¿î²»´íµÄ²âÊÔ¹¤¾ß£¬ÏÂÃæ¾ÍÀ´Ñ§Ï°ÔõôʹÓÃËü¡£
pytest²»ÊÇpython±ê×¼·¢ÐаüÀïÃæµÄÒ»¸öÄ£¿é£¬ËùÒÔʹÓÃǰÐèÒª½øÐÐһϰ²×°²Ù×÷£¬°²×°µÄ·½·¨Ò²·Ç³£¼òµ¥£¬Ö»ÐèÒªÖ´ÐÐÈçÏÂÃüÁ
»òÕß
Èç¹û²»Ì«Á˽âpipºÍeasy_install ¿ÉÒԲο¼ÆäËû×ÊÁÏ¡£
°²×°Íê³ÉÖ®ºó¿ÉÒÔÓÃÈçϵÄÃüÁî¼ì²âÊÇ·ñ°²×°³É¹¦£º
¿´µ½ÈçϽá¹û±íÃ÷°²×°³É¹¦£º

ÔÚ°²×°½áÊøÖ®ºó¾ÍÀ´¿´ÏÂÈçºÎÊÇʹÓá£
pytestµÄ»ù±¾Ê¹ÓÃ˼ÏëºÍunittestÄ£¿é²î²»¶à£¬ÏÈÀ´¿´Ò»¸ö¼òµ¥µÄСÀý×Ó£º
#test_sample.py
def func(x):
return x + 1
def test_answer():
assert func(3) == 5 |
È»ºóÖն˽øÈëµ½test_sample.py ËùÔÚĿ¼ÏÂÔËÐÐÈçÏÂÃüÁ
½á¹ûÈçÏÂËùʾ£º

¿´Ò»ÏÂÉÏÃæµÄÀý×Ó£¬Ð´ÁËÒ»¸öº¯Êý£¬²¢Ð´ÁËÒ»¸ö¼òµ¥µÄ²âÊÔÓÃÀý£¬ÓÃÀýÖÐÖ»ÓÐÒ»Ìõ¶ÏÑÔÓï¾ä£¬Ïà±ÈÓÚunittestÄ£¿é£¬¸Ã³ÌÐòÓÐÁËÈçϵļò»¯£¬¼´²âÊÔ·½·¨²»ÐèÒª·â×°ÔÚÒ»¸öTestCaseµÄ×ÓÀàÖУ¨µ±È»Èç¹û²âÊÔÓÃÀýÅӴ󣬷â×°µ½²»Í¬µÄÀàÖл¹ÊǺÜÓбØÒª)£¬Í¬Ê±Ò²²»±ØÒªµ¼ÈëÈκÎÄ£¿é£¬¼´¿ÉÍê³ÉÒ»¸ö¼òµ¥µÄ²âÊÔ¡£
pytestͬunittestÀàËÆ£¬Ò²ÌṩÁËÐí¶àÃüÁîÐÐʹÓõĽӿÚ
²âÊÔij¸öÄ£¿é£º
py.test testfile_name
²âÊÔij¸öÄ£¿é£¬²¢ÔÚÊ״δíÎóÓÃÀý³öÏÖºóÍ£Ö¹²âÊÔ£º
py.test -x testfile_name
²âÊÔij¸öÄ£¿é£¬ÔÚ³öÏÖn¸ö´íÎóºóÍ£Ö¹£º
py.test ¨Cmaxfail testfile_name
µÈµÈ»¹ÓкܶàÃüÁî¾ßÌå¿ÉÒԲο¼¹Ù·½Îĵµ
pytest¹Ù·½Îĵµ
ÏÂÃæÀ´ËµÏÂpytestµÄһЩ±È½ÏÓÐÓõÄÌØÐÔ¡£
Ê×ÏÈÊÇpytestÖеĶÏÑÔ»úÖÆ¡£
ʹÓÃÆðÀ´·Ç³£¼òµ¥£¬¾ÍͬÉÏÊöÀý×ÓÒ»ÑùÖ±½ÓÒ»¸öassertÓï¾ä¾Í¿ÉÒÔÍê³É¡£
Èç¹ûÒª¶ÏÑÔ»á³öÏÖij¸öÒì³£¿ÉÒÔʹÓÃÈçϵķ½Ê½£º
import pytest
def test_zero_division():
with pytest.raises(ZeroDivisionError):
1 / 0 |
ÕâÑùÔÚ³öÏÖ¸ÃÒì³£µÄʱºòÕâ¸ö²âÊÔÓÃÀýÒ²²»»á±ê¼ÇΪʧ°Ü¡£
Ò²¿ÉÒÔ×Ô¶¨ÒåÒì³£µÄÌáʾÐÅÏ¢£¬¿´Ò»¸öÏÂÃæµÄÀý×Ó
# content of conftest.py
from test_foocompare import Foo
def pytest_assertrepr_compare(op, left, right):
if isinstance(left, Foo) and isinstance(right,
Foo) and op == "==":
return ['Comparing Foo instances:',
' vals: %s != %s' % (left.val, right.val)] |
# content of test_foocompare.py
class Foo:
def __init__(self, val):
self.val = val
def test_compare():
f1 = Foo(1)
f2 = Foo(2)
assert f1 == f2 |
È»ºóÖÕ¶ËÔËÐУº
py.test -q test_foocompare.py
|
½á¹ûÈçÏÂËùʾ£º

¿ÉÒÔ¿´³öÒª×Ô¶¨ÒåÒì³£ÐÅÏ¢£¬Ö»ÐèÒªÔÚconftest.py ÀïÃæ¶¨ÒåÒ»¸öÃûΪpytest_assertrepr_compareµÄº¯Êý¼´¿É¡£
È»ºó²»µÃ²»¿´µÄÒ»¸öÌØÐÔ¾ÍÊÇfixtureÌØÐÔ¡£
ÕâÊǹٷ½ÎĵµÖжÔfixtureÌØÐÔµÄÒ»¸ö½éÉÜ
Test functions can receive fixture objects by naming
them as an input argument. For each argument name,
a fixture function with that name provides the fixture
object.
À´¿´Ò»¸öÀý×Ó£º
# content of ./test_smtpsimple.py
import pytest
@pytest.fixture
def smtp():
import smtplib
return smtplib.SMTP("merlinux.eu")
def test_ehlo(smtp):
response, msg = smtp.ehlo()
assert response == 250
assert 0 # for demo purposes |
È»ºóÖÕ¶ËÀïÔËÐУº
py.test test_smtpsimple.py |
¿ÉÒÔ¿´µ½ÈçϽá¹û£º

ÉÏÊöÀý×ÓµÄÖ´Ðйý³ÌÊÇÕâÑù×Ó£¬pytest Ê×ÏÈѰÕÒtest_ ǰ׺¿ªÍ·µÄº¯Êý£¬ÕÒµ½test_ehlo()º¯Êý£¬È»ºó·¢Ïָú¯ÊýÐèÒªÒ»¸öÃûΪsmtpµÄ²ÎÊý£¬¾Í»áȥѰÕÒÓÐ@pytest.fixture±ê¼ÇµÄÃû³ÆÎªsmtpµÄº¯Êý£¬²¢¹¹ÔìÒ»¸öfixture
object´«µÝ¸ø¸Ã²âÊÔº¯Êý£¬Ö®ºóÖ´ÐвâÊÔº¯Êý¡£
º¯Êý²ÎÊý»¯ÊÇÒ»ÖÖÒÀÀµ×¢ÈëµÄ˼Ïë¡£
Á˽âÁËfixtureÊÇÈçºÎʹÓõÄÖ®ºó£¬ÎÒÃÇÀ´¿´Ò»ÏÂfixtureµÄһЩÏêϸµÄ½éÉÜ¡£
ÓÉÓÚ¹¹ÔìÒ»¸öfixture objectÊǷdz£ºÄ·Ñʱ¼äµÄ£¬ËùÒÔͨ³£Ò»¸öfixture object¶ÔÏó»á±»Ðí¶àº¯ÊýËù¹²Ïí¡£pytestÌṩÁËÉùÃ÷ÔÚ²»Í¬¼¶±ð¹²ÏíµÄ·½·¨
ÿ¸öº¯ÊýÒ»¸öfixture object£º£º
@pytest.fixture(scope =
"function") |
ÿ¸öÄ£¿éÒ»¸öfixture object
@pytest.fixture(scope =
"module") |
ËùÓÐÄ£¿é¶¼¹²ÏíÒ»¸öfixture object
@pytest.fixture(scope =
"session") |
ÔÚfixture object¶ÔÏóʹÓÃÍêÒÔºó»áÓÐÒ»¸ödestroy ¹ý³Ì£¬Èç¹ûÏëÒªÔÚdestroy¹ý³ÌÖнøÐÐÒ»Ð©ÌØÊâµÄ²Ù×÷£¬¿ÉÒÔ¸øfixture
º¯ÊýÔö¼ÓÒ»¸örequest¶ÔÏó£¬È»ºó¶¨ÒåÒ»¸ö°üº¬ÄãÏëÒªÖ´ÐеIJÙ×÷µÄº¯Êý£¬µ÷ÓÃrequestµÄaddfinalizer£¨funct_name£©·½·¨À´°Ñ¸Ãº¯Êý×¢²áµ½Õâ¸öfixture
objectÖС£
¿ÉÒÔ¿´Ò»¸öʾÀý£º
@pytest.fixture(scope="module")
def smtp(request):
smtp = smtplib.SMTP("merlinux.eu")
def fin():
print ("teardown smtp")
smtp.close()
request.addfinalizer(fin)
return smtp # provide the fixture value |
È»ºó¾ÍÏñ֮ǰËù˵µÄÄÇÑùÖ´ÐвâÊÔÃüÁî¾Í¿ÉÒÔÁË¡£
fixture »¹¿ÉÒÔ½øÐвÎÊý»¯£¬¿ÉÒÔ¸øfixtureº¯ÊýÒ»¸ö¡°param = []¡± µÄ¹Ø¼ü×Ö²ÎÊý£¬Ö®ºó¶ÔÓÚparamÖеÄÿ¸öÖµ¶¼»á¹¹ÔìÒ»¸öfixture
object´«µÝ¸ø²âÊÔº¯ÊýʹÓá£
¿ÉÒÔ¿´ÏÂÈçϵĴúÂ룺
# content of conftest.py
import pytest
import smtplib
@pytest.fixture(scope="module",
params=["merlinux.eu", "mail.python.org"])
def smtp(request):
smtp = smtplib.SMTP(request.param)
def fin():
print ("finalizing %s" % smtp)
smtp.close()
request.addfinalizer(fin)
return smtp |
¶ÔÓÚÿ¸öÐèҪʹÓõ½smtpÕâ¸öfixtureµÄ²âÊÔº¯Êý£¬¶¼»á½ÓÊÕÁ½¸öfixture object¶ÔÏó£¬Ò»¸öʹÓõÄÊÇ¡°merlinux.edu¡±
²ÎÊý£¬ÁíÒ»¸öʹÓõÄÊÇ¡±mail.python.org¡±²ÎÊý¡£
ʹÓÃÈçÏÂÃüÁî¿ÉÒÔ¿´µ½×Ô¶¯Éú³ÉµÄÿ¸öfixture objectµÄid£º
Ò²¿ÉÒÔÔö¼ÓÒ»¸öids µÄ²ÎÊýÀ´×Ô¶¨Òåÿ¸öfixture objectµÄidÈçÏ´úÂëËùʾ£º
import pytest
@pytest.fixture(params=[0, 1], ids=["spam",
"ham"])
def a(request):
return request.param |
×¢Òâ0 Õâ¸ö²ÎÊýËù¹¹ÔìµÄfixture object¶ÔÏóËù¶ÔÒ»µÄidΪ ¡°spam¡±, 1¶ÔӦΪ¡°ham¡±
ÔÚÒ»¸öfixtureº¯ÊýÖпÉÒÔµ÷ÓÃÆäËûµÄfixtureº¯Êý£¬Ö»Òª¸Ã±»Ê¹ÓõÄfixtureµÄÓò·¶Î§±ÈʹÓøÃfixtureµÄÓò·¶Î§´ó¼´¿É¡£
ÔÚfixtureµÄʹÓùý³ÌÖУ¬pytest»á×Ô¶¯¾ö¶¨Ã¿¸ö²âÊÔº¯ÊýµÄµ÷ÓÃ˳Ðò£¬Ê¹µÃÄÚ´æÖдæÔÚ×îÉÙµÄfixture
object£¬ÒÔ¼õÉÙ¶Ôϵͳ×ÊÔ´µÄÕ¼Óá£
ÔÚʹÓÃfixture objectµÄʱºòÒ²¿ÉÒÔÖ÷¶¯¸æËßpytest£¨¿ÉÒÔ¼õÉÙ²éÕҵĿªÏú£©Òªµ÷ÓÃij¸öfixture
£¬·½Ê½ÈçÏ£º
@pytest.mark.usefixtures(fixture_name1,
fixture_name2, ...) |
Èç¹ûÒª¸æËßpytestÒªÔÚÕâ¸öÄ£¿é¶¼Ê¹ÓÃij¸öfixture£¬¿ÉÒÔ¸øÕâ¸öÄ£¿é¶¨ÒåÒ»¸öÈçϵÄÊôÐÔ£º
pytestmark = pytest.mark.usefixtures(fixture_name1,
fixture_name2, ...) |
Èç¹ûÒªÔÚ¸æËßpytestÔÚÕû¸ö²âÊÔ¹¤³ÌÖж¼ÒªÊ¹ÓÃij¸öfixture ¿ÉÒÔн¨Ò»¸öÈçϵÄÎļþ£º
# content of pytest.ini
[pytest]
usefixtures = cleandir |
fixture¿ÉÒÔ±»¸²¸Ç£¬ÓÐÐí¶à¼¶±ðµÄ¸²¸Ç¡£
ÔÚ½éÉÜÍêfixtureÌØÐÔÖ®ºóÔÙÀ´¿´Á½¸öÌØÐÔ£¬skipºÍxfailÊôÐÔ¡£
ÔÚÂú×ãÌØ¶¨µÄÌõ¼þÏÂÌø¹ý¸Ã²âÊÔº¯Êý£¬Ö»ÐèÒªÔÚÕâ¸ö²âÊÔº¯ÊýǰʹÓÃÈçÏÂÃüÁî
@pytest.mark.skipif(sys.version_info
> (3,3), reason = "requ....") |
չʾÏêϸµÄ²âÊÔÐÅÏ¢¿ÉÒÔʹÓà -rsÑ¡Ï
ÕâЩmarkÒ²¿ÉÒÔ¹²Ïí£¬ÒªÔÚÄ£¿é¼ä¹²ÏíÒ»¸ömark¿ÉÒÔ¶¨ÒåÒ»¸öÈçϱäÁ¿£º
minversion = pytest.mark.skipif(mymodule.__versioninfo__
< (1,1), reason="at least mymodule-1.1
required") |
È»ºóÔÚ²âÊԵĺ¯Êýǰ¼ÓÉÏ@minversion ¼´¿É
¶ÔÓÚÒ»¸ö´óµÄ²âÊÔÏîÄ¿£¬Í¨³£°Ñmarker·ÅÔÚÒ»¸öµ¥¶ÀµÄmarkÎļþÖÐ
ÒªÔÚÂú×ãÌõ¼þµÄÇé¿öÏÂÌø¹ýÒ»Õû¸ö²âÊÔÀ࣬¿ÉÒÔÔڸòâÊÔÀàǰÌí¼ÓÈçÏÂÓï¾ä£º
@pytest.mark.skipif(sys.platform
== "win32", reason = "requires
windows") |
Ò²¿ÉÒÔΪÕâ¸öÀඨÒåÒ»¸öpytestmark ÊôÐÔÈçÏ£º
pytestmark = pytest.mark.skipif(sys.platform==
'win32', reason = "requires windows") |
Èç¹ûÔÚÒ»¸öÄ£¿éÖж¨ÒåÕâ¸öÈ«¾ÖµÄÊôÐÔ£¬pytestmark ¿ÉÒÔÔÚÂú×ãÌõ¼þµÄÇé¿öÏÂÌø¹ý¸Ã²âÊÔÄ£¿é
ÏÂÃæÊÇxfailÊôÐԵĽéÉÜ
xfailÊôÐÔÊÇÓÃÀ´±íÃ÷Ò»¸ö²âÊÔÓÃÀýÔ¤¼ÆÊÇ»áʧ°ÜµÄ£¬ÔÚ²âÊÔµÄʱºò»áÌø¹ý¸ÃÓÃÀý£¬ÔÚ¼ÆË㲻ͨ¹ýµÄÓÃÀýµÄʱºò²»Óÿ¼ÂÇ¡£
ʹÓÃxfailÊôÐÔ£¬Ö»ÐèÒªÔÚ²âÊÔÓÃÀý֮ǰ¼ÓÉÏÒ»¾ä£º
ÓÃpy.test ¨Crunxfail ÔËÐпÉÒÔÇ¿ÖÆÖ´ÐбíÃ÷ΪxfailµÄÎļþ£¬¾ÍºÃÏñûÓбêÃ÷Ò»Ñù
¿ÉÒÔÉùÃ÷ÔÚij¸öÌØ¶¨Ìõ¼þÏ»áʧ°ÜµÄ²âÊÔ
@pytest.mark.xfail(sys.version_info
>= (3,3),
reason="python3.3 api changes") |
Óà -rx Ñ¡Ïî¿ÉÒÔÏêϸÁгöxfailµÄÐÅÏ¢
Skip/xfail Ò²¿ÉÒÔ²ÎÊý»¯£º
ÐÎʽÈçÏ£º
@pytest.mark.parametrize(("n",
"expected"), [
(1, 2),
pytest.mark.xfail((1, 0)),
pytest.mark.xfail(reason="some bug")((1,
3)),
(2, 3),
(3, 4),
(4, 5),
pytest.mark.skipif("sys.version_info >=
(3,0)")((10, 11)),
]) |
Èç¹ûÒªÔÚµ¼Èëʧ°ÜµÄʱºòÌø¹ý¿ÉÒÔ¸ø¸ÃÄ£¿é¶¨ÒåÒ»¸öÈçÏÂÊôÐÔ£º
docutils = pytest.importorskip("docutils") |
»òÕßÒªÇóµ¼ÈëµÄ°üÒªÂú×ãÌØ¶¨µÄ°æ±¾£º
docutils = pytest.importorskip("docutils",
minversion = "0.3") |
×îºóÒªÌáһϵľÍÊÇpytestµÄ²å¼þʹÓã¬ÔÚpytestÖвå¼þʹÓ÷dz£¼òµ¥£¬Ö»Òª°²×°ÁËÏàÓ¦µÄ²å¼þ£¬pytest¶¼»áÔÚÔËÐеÄʱºò×Ô¶¯µ¼ÈëËùÓеIJå¼þ£¬¾ßÌå¿ÉÒԲο¼¹Ù·½Îĵµ¡£
×ܽá
unittestÊÇpython×Ô´øµÄÒ»¸öÄ£¿é£¬ºÜ¶àÆäËûµÄ²âÊÔ¿ò¼Ü¶¼ºÍÆäÀàËÆ£¬unittestµÄʹÓÃÖ»ÐèÒª¶¨ÒåһЩÒÔtest_
ǰ׺¿ªÍ·µÄ·½·¨£¬²¢·â×°µ½Ò»¸öTestCaseµÄ×ÓÀàÖУ¬unittestÄ£¿é¾Í»á×Ô¶¯×°ÔغÍÖ´ÐÐÕâЩ²âÊÔ£¬unittestÄ£¿éÒ»¸ö¿ÉÒԺܷ½±ãµÄÔÚÃüÁîÐÐÏÂʹÓã¨ÓкܶàÃüÁ·Ç³£·½±ã£©¡£Í¬Ê±unittestÄ£¿éÀïÌṩÁËskipºÍexpectedFailureÊôÐÔ£¬¿ÉÒÔÈÃÎÒÃÇÌø¹ýijЩ²âÊÔ£¬»òÕß±ê¼ÇijЩÓÃÀýΪԤÆÚ¾ÍÊÇʧ°ÜµÄ¡£
pytestÊǵÚÈý·½¿ª·¢µÄÒ»¸öpythonµÄ²âÊÔ¿ò¼Ü£¬Ê¹Óõķ½·¨ºÍ˼·¶¼»ù±¾ºÍunittestÀàËÆ£¬pytestÓÐÒ»¸öÇ¿´óµÄfixtureÌØÐÔ£¬ÒÔ¼°skipºÍxfail±ê¼Ç£¬Í¬Ê±pytestµÄ²å¼þ×ÊÔ´·Ç³£·á¸»£¬°²×°ºÍʹÓÃÒ²·Ç³£µÄ·½±ã¡£pytestÓ¦Ó÷dz£¹ã·º£¬ÊÇÒ»¿îºÜºÃµÄ²âÊÔ¹¤¾ß¡£
|