Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Python²âÊÔÄ£¿éѧϰ±Ê¼Ç
 
À´Ô´£ºcsdn ·¢²¼ÓÚ:2017-10-16
  4001  次浏览      30
 

¹ØÓÚ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 -install -U pytest

»òÕß

easy_install -U pytest

Èç¹û²»Ì«Á˽âpipºÍeasy_install ¿ÉÒԲο¼ÆäËû×ÊÁÏ¡£

°²×°Íê³ÉÖ®ºó¿ÉÒÔÓÃÈçϵÄÃüÁî¼ì²âÊÇ·ñ°²×°³É¹¦£º

py.test --version

¿´µ½ÈçϽá¹û±íÃ÷°²×°³É¹¦£º

ÔÚ°²×°½áÊøÖ®ºó¾ÍÀ´¿´ÏÂÈçºÎÊÇʹÓá£

pytestµÄ»ù±¾Ê¹ÓÃ˼ÏëºÍunittestÄ£¿é²î²»¶à£¬ÏÈÀ´¿´Ò»¸ö¼òµ¥µÄСÀý×Ó£º

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

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

È»ºóÖն˽øÈëµ½test_sample.py ËùÔÚĿ¼ÏÂÔËÐÐÈçÏÂÃüÁ

py.test 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£º

py.test --collect-only

Ò²¿ÉÒÔÔö¼ÓÒ»¸ö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Ñ¡Ï

py.test -rs test_module

ÕâЩ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ÊôÐÔ£¬Ö»ÐèÒªÔÚ²âÊÔÓÃÀý֮ǰ¼ÓÉÏÒ»¾ä£º

@pytest.mark.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£¹ã·º£¬ÊÇÒ»¿îºÜºÃµÄ²âÊÔ¹¤¾ß¡£

 

   
4001 ´Îä¯ÀÀ       30
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ