±¾ÎĽ«½øÈëµ¥Ôª²âÊԵIJ¿·Ö£¬ÕâÒ²ÊÇ»ù´¡ÖªÊ¶ÖÐ×îºóÒ»¸ö´ó¿é¡£±¾ÎĽ«Öص㽲ÊöPythonºÍOpenStackÖеĵ¥Ôª²âÊÔµÄÉú̬»·¾³¡£
ͨ¹ýdemoѧϰOpenStack¿ª·¢¡ª¡ªµ¥Ôª²âÊÔ µ¥Ôª²âÊÔµÄÖØÒªÐÔ µ¥Ôª²âÊÔ¹¤¾ß unittest mock testtools fixtures testscenarios subunit testrepository coverage tox µ¥Ôª²âÊÔ¹¤¾ßС½á KeystoneµÄµ¥Ôª²âÊÔ¿ò¼Ü ʹÓÃtox½øÐвâÊÔ»·¾³¹ÜÀí ʹÓÃtestrepository¹ÜÀí²âÊÔµÄÔËÐÐ µ¥Ôª²âÊÔÓÃÀýµÄ´úÂë¼Ü¹¹ ×ܽá ϵÁкó¼Ç |
µ¥Ôª²âÊÔµÄÖØÒªÐÔ
GitHubÉÏÓиöÈË»ÁËһЩ²»Í¬ÓïÑÔµÄѧϰÇúÏßͼ£ºLearning Curves
(for different programming languages)£¬ËäÈ»ÓÐЩ¶ñ¸ãµÄÇãÏò£¬²»¹ýȷʵ˵Ã÷ÁËÎÊÌâ¡£ÕâÀïÌùÒ»ÏÂPythonµÄ²¿·Ö£º

Õâ¸öͼ˵Ã÷ÁË£¬»áµ¥Ôª²âÊÔ¶ÔÓÚÌá¸ßPythonÉú²úÁ¦µÄÖØÒªÐÔ£¬ÕâÖ÷ÒªÊÇÒòΪPythonÊǸö¶¯Ì¬ÓïÑÔ£¬ºÜ¶àÎÊÌâ¶¼ÎÞ·¨Í¨¹ý¾²Ì¬±àÒë¼ì²éÀ´·¢ÏÖ£¬Òò´Ëµ¥Ôª²âÊԾͳÉÁËÒ»¸öÖØÒªµÄÈ·±£ÖÊÁ¿µÄÊֶΡ£OpenStackµÄºËÐÄÏîÄ¿¶¼¶Ôµ¥Ôª²âÊÔÓм«¸ßµÄÒªÇó£¬ÒÔ±£Ö¤ÏîÄ¿µÄ¸ßÖÊÁ¿¡£
µ¥Ôª²âÊÔ¹¤¾ß
PythonµÄµ¥Ôª²âÊÔ¹¤¾ßºÜ¶à£¬Îªµ¥Ôª²âÊÔÌṩ²»Í¬·½ÃæµÄ¹¦ÄÜ¡£OpenStackµÄÏîĿҲ»ù±¾°ÑÏÖÔÚÁ÷Ðеĵ¥Ôª²âÊÔ¹¤¾ß¶¼ÓÃÈ«ÁË¡£µ¥Ôª²âÊÔ¿ÉÒÔ˵ÊÇÈëÃÅOpenStack¿ª·¢µÄ×îÄѵIJ¿·Ö£¬Ò²ÊÇ×îºóÒ»¹«Àï¡£±¾Õ£¬ÎÒÃǾͽéÉÜÒ»ÏÂÔÚOpenStackÖлáÓõ½µÄµ¥Ôª²âÊԵŤ¾ß¡£ÓÉÓÚÊýÁ¿ºÜ¶à£¬²»¿ÉÄÜÏêϸ½éÉÜ£¬Òò´ËÖ÷Òª×öһЩ¸ÅÄîºÍÓÃ;ÉϵĽéÉÜ¡£
unittest
unittestÊÇPythonµÄ±ê×¼¿â£¬ÌṩÁË×î»ù±¾µÄµ¥Ôª²âÊÔ¹¦ÄÜ£¬°üÀ¨µ¥Ôª²âÊÔÔËÐÐÆ÷£¨¼ò³Ærunner£©ºÍµ¥Ôª²âÊÔ¿ò¼Ü¡£ÏîÄ¿µÄµ¥Ôª²âÊÔ´úÂëµÄ²âÊÔÀà¿ÉÒԼ̳Ðunittest.TestCaseÀ࣬ÕâÑùÕâ¸öÀà¾ÍÄܹ»±»runner·¢ÏÖ²¢ÇÒÖ´ÐС£Í¬Ê±£¬unittest.TestCaseÕâ¸öÀ໹¶¨ÒåÁËsetUp()£¬tearDown()£¬setUpClass()ºÍtearDownClass()·½·¨£¬ÊÇÓÃÀ´ÔËÐе¥Ôª²âÊÔǰµÄÉèÖù¤×÷´úÂëºÍµ¥Ôª²âÊÔºóµÄÇåÀí¹¤×÷´úÂ룬Õâ¸öÒ²ÊÇËùÓÐPython´úÂë×ñÊØµÄ¹æ·¶£¬ËùÒÔµÚÈý·½µÄµ¥Ôª²âÊÔ¿âºÍ¿ò¼ÜÒ²¶¼×ñÑÕâ¸ö¹æ·¶¡£
unittest¿âÒ²ÌṩÁËÒ»¸örunner£¬¿ÉÒÔʹÓÃ$ python -m unittest test_moduleµÄÃüÁîÀ´Ö´ÐÐij¸öÄ£¿éµÄµ¥Ôª²âÊÔ¡£ÁíÍ⣬ÔÚPythonÖÐÖ¸¶¨ÒªÔËÐеĵ¥Ôª²âÊÔÓÃÀýµÄÍêÕûÓï·¨ÊÇ£ºpath.to.your.module:ClassOfYourTest.test_method¡£
unittestÊÇѧϰPythonµ¥Ôª²âÊÔ×î»ù±¾Ò²×îÖØÒªµÄÒ»¸ö¿â£¬ÍêÕûµÄ˵Ã÷Çë²é¿´¹Ù·½Îĵµ¡£
mock
mockÒ²ÊÇÁíÒ»¸öÖØÒªµÄµ¥Ôª²âÊԿ⣬ÔÚPython 2ÖÐÊÇ×÷Ϊһ¸öµÚÈý·½¿â±»Ê¹Óõ쬵½Python 3ʱ£¬¾Í±»ÄÉÈëÁ˱ê×¼¿â£¬¿É¼ûÕâ¸ö¿âµÄÖØÒªÐÔ¡£¼òµ¥µÄ˵£¬mock¾ÍÊÇÓÃÀ´Ä£Äâ¶ÔÏóµÄÐÐΪ£¬ÕâÑùÔÚ½øÐе¥Ôª²âÊÔµÄʱºò£¬¿ÉÒÔÖ¸¶¨ÈκζÔÏóµÄ·µ»ØÖµ£¬±ãÓÚ²âÊÔ¶ÔÍⲿ½Ó¿ÚÓÐÒÀÀµµÄ´úÂë¡£¹ØÓÚmockµÄʹÓ㬿ÉÒԲ鿴ÎÒ֮ǰдµÄÕâÆªÎÄÕÂPython
MockµÄÈëÃÅ¡£
testtools
testtoolsÊǸöunittestµÄÀ©Õ¹¿ò¼Ü£¬Ö÷ÒªÊÇÔÚunittestµÄ»ù´¡ÉÏÌṩÁ˸üºÃµÄassert¹¦ÄÜ£¬Ê¹µÃдµ¥Ôª²âÊÔ¸ü¼Ó·½±ã¡£¾ßÌå¿ÉÒԲ鿴Îĵµ¡£
fixtures
fixtureµÄÒâ˼Êǹ̶¨×°Öã¬ÔÚPythonµÄµ¥Ôª²âÊÔÖУ¬ÊÇָij¶Î¿ÉÒÔ¸´Óõĵ¥Ôª²âÊÔsetUpºÍtearDown´úÂë×éºÏ¡£Ò»¸öfixtureÒ»°ãÓÃÀ´ÊµÏÖij¸ö×é¼þµÄsetUpºÍtearDownÂß¼£¬±ÈÈç²âÊÔǰҪÏÈ´´½¨ºÃijЩÊý¾Ý£¬²âÊÔºóҪɾµôÕâЩÊý¾Ý£¬ÕâЩ²Ù×÷¾Í¿ÉÒÔ·â×°µ½Ò»¸öfixtureÖС£ÕâÑù²»Í¬µÄ²âÊÔÓÃÀý¾Í²»ÓÃÖØ¸´Ð´ÕâЩ´úÂ룬ֻҪʹÓÃfixture¼´¿É¡£fixturesÄ£¿éÊÇÒ»¸öµÚÈý·½Ä£¿é£¬ÌṩÁËÒ»ÖÖ¼òµ¥µÄ´´½¨fixtureÀàºÍ¶ÔÏóµÄ»úÖÆ£¬²¢ÇÒÒ²ÌṩÁËһЩÄÚÖõÄfixture¡£¾ßÌåµÄʹÓ÷½·¨¿ÉÒԲ鿴¹Ù·½Îĵµ¡£
testscenarios
testscenariosÄ£¿éÂú×ãÁ˳¡¾°²âÊÔµÄÐèÇó¡£ËüµÄ»ù±¾Ó÷¨ÊÇÔÚ²âÊÔÀàÖÐÌí¼ÓÒ»¸öÀàÊôÐÔscenarios£¬¸ÃÊôÐÔÊÇÒ»¸öÔª×飬¶¨ÒåÁËÿһÖÖ³¡¾°Ï²»Í¬µÄ±äÁ¿µÄÖµ¡£±ÈÈç˵Äã²âÊÔÒ»¶ÎÊý¾Ý·ÃÎÊ´úÂ룬ÄãÐèÒª²âÊԸôúÂëÔÚʹÓò»Í¬µÄÇý¶¯Ê±£¬±ÈÈçMongoDB¡¢SQL¡¢File£¬ÊÇ·ñ¶¼ÄÜÕý³£¹¤×÷¡£ÎÒÃÇÓÐÈýÖÖ°ì·¨£º
×µÄ°ì·¨ÊÇΪ²»Í¬µÄÇý¶¯°Ñͬһ¸ö²âÊÔÓÃÀý±àд3±é¡£
±È½ÏºÃµÄ°ì·¨ÊÇ£¬±àдһ¸öͳһµÄ·Ç²âÊÔÓÃÀý·½·¨£¬½ÓÊÕdriver×÷Ϊ²ÎÊý£¬Ö´ÐвâÊÔÂß¼£¬È»ºóÔÙ·Ö±ð±àдÈý¸ö²âÊÔÓÃÀý·½·¨È¥µ÷ÓÃÕâ¸ö·Ç²âÊÔÓÃÀý·½·¨¡£
¸üºÃµÄ°ì·¨¾ÍÊÇʹÓÃtestscenariosÄ£¿é£¬¶¨ÒåºÃscenarios±äÁ¿£¬È»ºóʵÏÖÒ»¸ö²âÊÔÓÃÀý·½·¨¡£
testscenariosÄ£¿éÔÚOpenStack CeilometerÖб»´óÁ¿Ê¹Ó᣸ü¶àµÄÐÅÏ¢¿ÉÒԲ鿴Îĵµ¡£
subunit
subunitÊÇÒ»¸öÓÃÓÚ´«Êäµ¥Ôª²âÊÔ½á¹ûµÄÁ÷ÐÒé¡£Ò»°ãÀ´Ëµ£¬ÔËÐе¥Ôª²âÊÔµÄʱºòÊǰѵ¥Ôª²âÊԵĽá¹ûÖ±½ÓÊä³öµ½±ê×¼Êä³ö£¬µ«ÊÇÈç¹ûÔËÐдóÁ¿µÄ²âÊÔÓÃÀý£¬ÕâЩ²âÊÔ½á¹û¾ÍºÜÄѱ»·ÖÎö¡£Òò´Ë¾Í¿ÉÒÔʹÓÃpython-subunitÄ£¿éÀ´ÔËÐвâÊÔÓÃÀý£¬²¢ÇҰѲâÊÔÓÃÀýͨ¹ýsubunitÐÒéÊä³ö£¬ÕâÑù²âÊÔ½á¹û¾Í¿ÉÒÔ±»·ÖÎö¹¤¾ß¾ÛºÏÒÔ¼°·ÖÎö¡£python-subunitÄ£¿é×Ô´øÁËһЩ¹¤¾ßÓÃÀ´½âÎösubunitÐÒ飬±ÈÈçÄã¿ÉÒÔÕâÑùÔËÐвâÊÔÓÃÀý£º$
python -m subunit.run test_module | subunit2pyunit£¬subunit2pyunitÃüÁî»á½âÎösubunitÐÒ飬²¢ÇÒÊä³öµ½±ê×¼Êä³ö¡£¹ØÓÚsubunitµÄ¸ü¶àÐÅÏ¢£¬Çë²é¿´¹Ù·½Îĵµ¡£
testrepository
OpenStackÖÐʹÓÃtestrepositoryÄ£¿é¹ÜÀíµ¥Ôª²âÊÔÓÃÀý¡£µ±Ò»¸öÏîÄ¿ÖеIJâÊÔÓÃÀýºÜ¶àʱ£¬ÈçºÎ¸üÓÐЧµÄ´¦Àíµ¥Ôª²âÊÔÓÃÀýµÄ½á¹û¾Í±äµÃºÜÖØÒª¡£testrepositoryµÄ³öÏÖ¾ÍÊÇΪÁ˽â¾öÕâ¸öÎÊÌâ¡£testrepositoryʹÓÃpython-subunitÄ£¿éÀ´ÔËÐвâÊÔÓÃÀý£¬È»ºó·ÖÎösubunitµÄÊä³ö²¢¶Ô²âÊÔ½á¹û½øÐмǼ£¨¼Ç¼µ½±¾µØÎļþ£©¡£¾ÙÀýÀ´Ëµ£¬testrepositoryÔÊÐíÄã×öÕâÑùµÄÊÂÇ飺
ÖªµÀÄÄЩÓÃÀýÔËÐÐʱ¼ä×
ÏÔʾÔËÐÐʧ°ÜµÄÓÃÀý
ÖØÐÂÔËÐÐÉÏ´ÎÔËÐÐʧ°ÜµÄÓÃÀý
testrepositoryµÄ¸ü¶àÐÅÏ¢£¬Çë²é¿´¹Ù·½Îĵµ¡£
coverage
coverageÊÇÓÃÀ´¼ÆËã´úÂëÔËÐÐʱµÄ¸²¸ÇÂʵģ¬Ò²¾ÍÊÇͳ¼Æ¶àÉÙ´úÂë±»Ö´ÐÐÁË¡£Ëü¿ÉÒÔºÍtestrepositoryÒ»ÆðʹÓã¬ÓÃÀ´Í³¼Æµ¥Ôª²âÊԵĸ²¸ÇÂÊ£¬ÔÚÔËÐÐÍêµ¥Ôª²âÊÔÖ®ºó£¬Êä³ö¸²¸ÇÂʱ¨¸æ¡£¾ßÌåµÄʹÓ÷½·¨¿ÉÒԲ鿴¹Ù·½Îĵµ¡£
tox
toxÊÇÓÃÀ´¹ÜÀíºÍ¹¹½¨ÐéÄâ»·¾³(virtualenv)µÄ¡£¶ÔÓÚÒ»¸öÏîÄ¿£¬ÎÒÃÇÐèÒªÔËÐÐPython 2.7µÄµ¥Ôª²âÊÔ£¬Ò²ÐèÒªÔËÐÐPython
3.4µÄµ¥Ôª²âÊÔ£¬»¹ÐèÒªÔËÐÐPEP8µÄ´úÂë¼ì²é¡£ÕâЩ²»Í¬µÄÈÎÎñÐèÒªÒÀÀµ²»Í¬µÄ¿â£¬ËùÒÔÐèҪʹÓò»Í¬µÄÐéÄâ»·¾³¡£Ê¹ÓÃtoxµÄʱºò£¬ÎÒÃÇ»áÔÚtoxµÄÅäÖÃÎļþtox.iniÖÐÖ¸¶¨²»Í¬ÈÎÎñµÄÐéÄâ»·¾³Ãû³Æ£¬¸ÃÈÎÎñÔÚÐéÄâ»·¾³ÖÐÐèÒª°²×°ÄÄЩ°ü£¬ÒÔ¼°¸ÃÈÎÎñÖ´ÐеÄʱºòÐèÒªÔËÐÐÄÄЩÃüÁî¡£¸ü¶àÐÅÏ¢£¬Çë²é¿´¹Ù·½Îĵµ¡£
µ¥Ôª²âÊÔ¹¤¾ßС½á
±¾Õ½éÉÜÁËOpenStackÖг£Óõĵ¥Ôª²âÊÔ¹¤¾ßµÄ»ù±¾ÓÃ;£¬Ï£Íû´ó¼Ò¶ÔÕâЩ¹¤¾ßÓиö´ó¸ÅµÄÈÏʶ¡£ÕâÀïÎÒÃÇ¿ÉÒÔ°´ÕÕÀà±ð×ܽáÒ»ÏÂÕâЩ¹¤¾ß£º
²âÊÔ»·¾³¹ÜÀí: tox
ʹÓÃtoxÀ´¹ÜÀí²âÊÔÔËÐеÄÐéÄâ»·¾³£¬²¢ÇÒµ÷ÓÃtestrepositoryÀ´Ö´ÐвâÊÔÓÃÀý¡£
²âÊÔÓÃÀýµÄÔËÐк͹ÜÀí: testrepository, subunit, coverage
testrepositoryµ÷ÓÃsubunitÀ´Ö´ÐвâÊÔÓÃÀý£¬¶Ô²âÊÔ½á¹û½øÐоۺϺ͹ÜÀí£»µ÷ÓÃcoverageÀ´Ö´ÐдúÂ븲¸ÇÂʵļÆËã¡£
²âÊÔÓÃÀýµÄ±àд: unittest, mock, testtools, fixtures, testscenarios
ʹÓÃtesttools×÷ΪËùÓвâÊÔÓÃÀýµÄ»ùÀ࣬ͬʱӦÓÃmock, fixtures, testscenariosÀ´¸üºÃµÄ±àд²âÊÔÓÃÀý¡£
ÔÚThe Hacker's Guide to Python£¨¡¶Python¸ßÊÖ֮·¡·£©Ò»ÊéÖУ¬Ò²ÓÐרÃŵÄÒ»Õ½éÉÜÁ˸÷ÖÖµ¥Ôª²âÊÔ¹¤¾ß¼°ÆäÓ÷¨£¬¶ÁÕßÒ²¿ÉÒԲο¼Ò»Ï¡£ÏÂÒ»Õ£¬ÎÒÃÇÀ´·ÖÎöKeystoneÏîÄ¿µÄµ¥Ôª²âÊÔ¿ò¼Ü£¬¿ÉÒÔÈÃÄã¿´µ½ÔÚOpenStackµÄʵ¼ÊÏîÄ¿ÖУ¬ÕâЩ¹¤¾ßÊÇÈçºÎ±»Ê¹Óõġ£
KeystoneµÄµ¥Ôª²âÊÔ¿ò¼Ü
ÏÖÔÚ£¬ÎÒÃÇÒÔKeystoneÏîĿΪÀý£¬À´¿´ÏÂÕæÊµÏîÄ¿Öеĵ¥Ôª²âÊÔÊÇÈçºÎ¼Ü¹¹µÄ¡£ÎÒÃDzÉÓÃ×Ô¶¥Ïòϵķ½Ê½£¬ÏÈ´Ó×îÉϲãµÄ²¿·Ö½éÉÜÆð¡£
ʹÓÃtox½øÐвâÊÔ»·¾³¹ÜÀí
´ó²¿·ÖÇé¿öÏ£¬ÎÒÃǶ¼ÊÇͨ¹ýtoxÃüÁîÀ´Ö´Ðе¥Ôª²âÊԵ쬲¢ÇÒ´«µÝ»·¾³Ãû³Æ¸øtoxÃüÁ
~/openstack/env/p/keystone git:(master) ? $ tox -e py27 |
toxÃüÁîÊ×ÏÈ»á¶ÁÈ¡ÏîÄ¿¸ùĿ¼ÏµÄtox.iniÎļþ£¬»ñÈ¡Ïà¹ØµÄÐÅÏ¢£¬È»ºó¸ù¾ÝÅäÖù¹½¨virtualenv£¬±£´æÔÚ.tox/Ŀ¼Ï£¬ÒÔ»·¾³Ãû³ÆÃüÃû£º
~/openstack/env/p/keystone git:(master) ? $ ls .tox log pep8 py27 |
³ýÁËlogĿ¼£¬ÆäËûµÄ¶¼ÊÇÆÕͨµÄvirtualenv»·¾³£¬Äã¿ÉÒÔ×Ô¼º²é¿´Ò»ÏÂÄÚÈÝ¡£ÎÒÃÇÀ´¿´ÏÂpy27Õâ¸ö»·¾³µÄÏà¹ØÅäÖã¨ÔÚtox.ini£©ÖУ¬ÎÒÖ±½ÓÔÚÄÚÈÝÉÏ×¢ÊÍһЩÅäÖõÄÓÃ;£º
[tox] minversion = 1.6 skipsdist = True # envlist±íʾ±¾ÎļþÖÐÅäÖõĻ·¾³¶¼ÓÐÄÄЩ envlist = py34,py27,pep8,docs,genconfig,releasenotes
# testenvÊÇĬÈÏÅäÖã¬Èç¹ûij¸öÅäÖÃÔÚ»·¾³×¨ÊôµÄsectionÖÐûÓУ¬¾Í´ÓÕâ¸ösectionÖжÁÈ¡
[testenv]
# usedevelop±íʾ°²×°virtualenvµÄʱºò£¬±¾ÏîÄ¿×Ô¼ºµÄ´úÂë²ÉÓÿª·¢Ä£Ê½°²×°£¬
Ò²¾ÍÊDz»»á¿½±´´úÂëµ½virtualenvĿ¼ÖУ¬Ö»ÊÇ×ö¸öÁ´½Ó
usedevelop = True
# install_command±íʾ¹¹½¨»·¾³µÄʱºòÒªÖ´ÐеÄÃüÁһ°ãÊÇʹÓÃpip°²×°
install_command = pip install -U {opts} {packages}
setenv = VIRTUAL_ENV={envdir}
# depsÖ¸¶¨¹¹½¨»·¾³µÄʱºòÐèÒª°²×°µÄÒÀÀµ°ü£¬Õâ¸ö¾ÍÊÇ×÷ΪpipÃüÁîµÄ²ÎÊý
# keystoneÕâÀïʹÓõÄд·¨±È½ÏÌØÊâÒ»µã£¬µÚ¶þÐеÄ.[ldap,memcache,mongodb]ÊÇÁ½¸öÒÀÀµ£¬
µÚÒ»¸öµã'.'±íʾµ±Ç°ÏîÄ¿µÄÒÀÀµ£¬Ò²¾ÍÊÇrequirements.txt£¬µÚ¶þ¸ö²¿·Ö[ldap,memcache,mongodb]
±íʾextra£¬ÊÇÔÚsetup.cfgÎļþÖж¨ÒåµÄÒ»¸ö¶ÎµÄÃû³Æ£¬¸Ã¶Î϶¨ÒåÁ˶îÍâµÄÒÀÀµ£¬ÕâЩ¿ÉÒԲ鿴PEP0508
# Ò»°ãµÄÏîÄ¿ÕâÀï»á²ÉÓøü¼òµ¥µÄ·½Ê½À´Êéд£¬Ö±½Ó°²×°Á½¸öÎļþÖеÄÒÀÀµ£º
# -r{toxinidir}/requirements.txt
# -r{toxinidir}/test-requirements.txt
deps = -r{toxinidir}/test-requirements.txt
.[ldap,memcache,mongodb]
# commands±íʾ¹¹½¨ºÃvirtualenvÖ®ºóÒªÖ´ÐеÄÃüÁÕâÀïµ÷ÓÃÁËtools/pretty_tox.shÀ´Ö´ÐвâÊÔ
commands =
find keystone -type f -name "*.pyc"
-delete
bash tools/pretty_tox.sh '{posargs}'
whitelist_externals =
bash
find
passenv = http_proxy HTTP_PROXY https_proxy HTTPS_PROXY
no_proxy NO_PROXY PBR_VERSION
# Õâ¸ösectionÊÇΪpy34»·¾³¶¨ÖÆÄ³Ð©ÅäÖõģ¬Ã»Óж¨ÖƵÄÅäÖ㬴Ó[testenv]¶ÁÈ¡
[testenv:py34]
commands =
find keystone -type f -name "*.pyc"
-delete
bash tools/pretty_tox_py3.sh |
ÉÏÃæÌáµ½µÄPEP-0508ÊÇÒÀÀµ¸ñʽµÄÍêÕû˵Ã÷¡£setup.cfgµÄextra²¿·ÖÈçÏ£º
[extras] ldap = python-ldap>=2.4:python_version=='2.7' # PSF ldappool>=1.0:python_version=='2.7' # MPL memcache = python-memcached>=1.56 # PSF mongodb = pymongo!=3.1,>=3.0.2 # Apache-2.0 bandit = bandit>=0.17.3 # Apache-2.0 |
ʹÓÃtestrepository¹ÜÀí²âÊÔµÄÔËÐÐ
ÉÏÃæÎÒÃÇ¿´µ½tox.iniÎļþÖеÄcommands²ÎÊýÖÐÖ´ÐеÄÊÇ_tools/pretty_tox.sh_ÃüÁî¡£Õâ¸ö½Å±¾µÄÄÚÈÝÈçÏ£º
#!/usr/bin/env bash
set -o pipefail
TESTRARGS=$1
# testrºÍsetuptoolsÒѾ¼¯³É£¬ËùÒÔ¿ÉÒÔͨ¹ýsetup.py testrÃüÁîÀ´Ö´ÐÐ
# --testr-args±íʾ´«µÝ¸øtestrÃüÁîµÄ²ÎÊý£¬¸æËßtestrÒª´«µÝ¸øsubunitµÄ²ÎÊý
# subunit-traceÊÇos-testr°üÖеÄÃüÁos-testrÊÇOpenStackµÄÒ»¸öÏîÄ¿£©£¬ÓÃÀ´½âÎösubunitµÄÊä³öµÄ¡£
python setup.py testr --testr-args="--subunit
$TESTRARGS" | subunit-trace -f
retval=$?
# NOTE(mtreinish) The pipe above would eat the
slowest display from pbr's testr
# wrapper so just manually print the slowest tests.
echo -e "\nSlowest Tests:\n"
# ²âÊÔ½áÊøºó£¬ÈÃtestrÏÔʾ³öÖ´ÐÐʱ¼ä×µÄÄÇЩ²âÊÔÓÃÀý
testr slowest
exit $retval |
too¾ÍÊÇ´Ótools/pretty_tox.shÕâ¸öÃüÁʼµ÷ÓÃtestrÀ´Ö´Ðе¥Ôª²âÊԵġ£testr±¾ÉíµÄÅäÖÃÊÇ·ÅÔÚÏîÄ¿¸ùĿ¼ÏµÄ.testr.confÎļþ£º
[DEFAULT] test_command= ${PYTHON:-python} -m subunit.run discover -t ./ ${OS_TEST_PATH:-./keystone/tests/unit} $LISTOPT $IDOPTION
test_id_option=--load-list $IDFILE
test_list_option=--list
group_regex=.*(test_cert_setup)
# NOTE(morganfainberg): If single-worker mode
is wanted (e.g. for live tests)
# the environment variable ``TEST_RUN_CONCURRENCY``
should be set to ``1``. If
# a non-default (1 worker per available core)
concurrency is desired, set
# environment variable ``TEST_RUN_CONCURRENCY``
to the desired number of
# workers.
test_run_concurrency=echo ${TEST_RUN_CONCURRENCY:-0}
|
Õâ¸öÎļþÖеÄÅäÖÃÏî¿ÉÒÔ´Ótestr¹Ù·½ÎĵµÖÐÕÒµ½¡£ÆäÖÐtest_commandÃüÁî±íʾҪִÐÐʲôÃüÁîÀ´ÔËÐвâÊÔÓÃÀý£¬ÕâÀïʹÓõÄÊÇsubunit.run£¬Õâ¸öÎÒÃÇÔÚÉÏÃæÌáµ½¹ýÁË¡£
µ½Ä¿Ç°ÎªÖ¹µÄÁ÷³Ì¾ÍÊÇ£º
tox½¨ºÃvirtualenv
toxµ÷ÓÃtestr
testrµ÷ÓÃsubunitÀ´Ö´ÐвâÊÔÓÃÀý
ÿ¸öOpenStackÏîÄ¿»ù±¾ÉÏÒ²¶¼ÊÇÕâÑù¡£Èç¹ûÄã×Ô¼ºÔÚ¿ª·¢Ò»¸öPythonÏîÄ¿£¬ÄãÒ²¿ÉÒԲο¼Õâ¸ö¼Ü¹¹¡£
µ¥Ôª²âÊÔÓÃÀýµÄ´úÂë¼Ü¹¹
ÏÂÃæÎÒÃÇÀ´¿´Ò»ÏÂKeystoneµÄµ¥Ôª²âÊÔ´úÂëÊÇÈçºÎдµÄ£¬Ö÷ÒªÊÇ¿´Ò»ÏÂÆä²ã´Î½á¹¹¡£Ã¿¸öOpenStackÏîÄ¿µÄµ¥Ôª²âÊÔ´úÂë½á¹¹¿ÉÄܶ¼²»Ò»Ñù£¬²»¹ýÄãÁ˽âÍêKeystoneµÄ½á¹¹Ö®ºó£¬¿´ÆäËûÏîÄ¿µÄ¾Í»á±È½Ï¿ìÁË¡£
ÎÒÃÇÒÔÒ»¸ö²âÊÔÀàΪÀýÀ´·ÖÎö²âÊÔ´úÂëµÄ½á¹¹£ºkeystone.tests.unit.test_v3_assignment:AssignmentTestCase¡£ÏÂÃæÊÇÕâ¸öÀàµÄ¼Ì³Ð½á¹¹£¬Í¬Ò»¼¶±ðµÄËõ½ø±íʾ¶àÖØ¼Ì³Ð£¬Ôö¼ÓËõ½ø±íʾ¸¸À࣬ÕâÀïɾµôÁ˲»±ØÒªµÄ·¾¶Ç°×º£¨´ÓunitĿ¼¿ªÊ¼£¬ÈçÏÂËùʾ£º
# Õâ¸ö²âÊÔÀàÊDzâRoleAssignmentµÄAPIµÄ unit.test_v3_assignment.RoleAssignmentBaseTestCase -> unit.test_v3.AssignmentTestMixin Õâ¸öÀà°üº¬ÁËһϲâÊÔAssignmentµÄ¹¤¾ßº¯Êý -> unit.test_v3.RestfulTestCase Õâ¸öÀàÊǽøÐÐV3 REST API²âÊԵĻùÀ࣬ʵÏÖÁËV3 APIµÄÇëÇ󷢯ðºÍУÑé -> unit.core.SQLDriverOverride ÓÃÓÚÐ޸ĸ÷¸öÅäÖõÄdriver×Ö¶ÎΪsql -> unit.test_v3.AuthTestMixin °üº¬´´½¨ÈÏÖ¤ÇëÇóµÄ¸¨Öúº¯Êý -> unit.rest.RestfulTestCase Õâ¸öÀàÊǽøÐÐRESP API²âÊԵĻùÀ࣬V2ºÍV3µÄAPI²âÊÔ ¶¼ÊÇÒÔÕâ¸öÀàΪ»ùÀ࣬Õâ¸öÀàµÄsetUp·½·¨»á³õʼ»¯Êý¾Ý¿â£¬´´½¨ºÃTestApp¡£ -> unit.TestCase Õâ¸öÀàÊÇKeystoneÖÐËùÓе¥Ôª²âÊÔÀàµÄ»ùÀ࣬ËüÖ÷Òª³õʼ»¯ÅäÖã¬ÒÔ¼°³õʼ»¯log -> unit.BaseTestCase Õâ¸öÀàÖ÷ÒªÊÇÅäÖòâÊÔÔËÐеĻù±¾»·¾³£¬ÐÞ¸ÄһЩ»·¾³±äÁ¿£¬±ÈÈçHOMEµÈ¡£ -> oslotest.BaseTestCase Õâ¸öÊÇÔÚoslotestÖж¨ÒåµÄ»ùÀ࣬
ÔÀ´ËùÓеÄOpenStackÏîÄ¿µÄµ¥Ôª²âÊÔ¶¼¼Ì³Ð×ÔÕâ¸ö»ùÀà¡£ ²»¹ý£¬Õâ¸ö¼Ì³ÐÔÚKeystoneÖÐÒѾ±»É¾³ýÁË£¬
Keystone×Ô¼ºÔÚunit.BaseTestCaseÖÐ×öÁ˲¶àµÄÊÂÇé¡£ Õâ¸öÊÇ2016-02-17×öµÄ±ä¸ü£¬¾ßÌåµÄ¿ÉÒԲ鿴Õâ¸örevision
262d0b66c3bcb82eadb663910ee21ded63e77a78¡£ -> testtools.TestCase ʹÓÃtesttools×÷Ϊ²âÊÔ¿ò¼Ü -> unittest.TestCase testtools±¾ÉíÊÇunittestµÄÀ©Õ¹ |
´ÓÉÏÃæµÄ²ã´Î½á¹¹¿ÉÒÔ¿´³ö£¬OpenStackÖеĴóÏîÄ¿£¬ÓÉÓÚµ¥Ôª²âÊÔÓÃÀýºÜ¶à£¨KeystoneÏÖÔÚÓг¬¹ý6200¸öµ¥Ôª²âÊÔÓÃÀý£©£¬ËùÒÔÆäµ¥Ôª²âÊԼܹ¹Ò²»á±È½Ï¸´ÔÓ¡£ÒªÐ´ºÃµ¥Ôª²âÊÔ£¬ÐèÒªÏÈÁ˽âÒ»ÏÂÕû¸ö²âÊÔ´úÂëµÄ¼Ü¹¹¡£
×ܽá
±¾ÎÄÎÒÃÇÁ˽âÁËPythonÖеĵ¥Ôª²âÊԵĸÅÄîºÍ¹¤¾ß£¬²¢ÇÒͨ¹ýKeystoneÏîÄ¿Á˽âÁËʵ¼ÊÏîÄ¿Öеĵ¥Ôª²âÊԵļܹ¹£¬Ï£ÍûÓÐÖúÓÚ¸÷λ¶ÁÕ߸üºÃµÄÕÆÎÕOpenStackÏîÄ¿µÄµ¥Ôª²âÊÔ»ù´¡¡£webdemoÏîĿĿǰûÓе¥Ôª²âÊԵĴúÂ룬ÓÐÐËȤµÄ¶ÁÕß¿ÉÒÔ×Ô¼ºforkÈ»ºó²Î¿¼KeystoneµÄ¼Ü¹¹ÎªÆäÔö¼ÓÍêÕûµÄµ¥Ôª²âÊԼܹ¹¡£
ϵÁкó¼Ç
Õâ¸öϵÁÐÎÒ´òËã¾Í´Ë½áÊø£¬µ½Ä¿Ç°ÎªÖ¹Ò»¹²Ð´ÁË8ƪÎÄÕ£¬Ð´Ð´Í£Í££¬Ç°ºóдÁË9¸öÔ¡£ÕâÀïÒ²×ö¸öС½á¡£
Ò»¿ªÊ¼Ð´Õâ¸öϵÁеÄÎÄÕÂÊÇÒòΪÎÒ×Ô¼ºÔÚѧϰOpenStack¿ª·¢µÄ¹ý³ÌÖÐÓöµ½ºÜ¶àÀ§ÄÑ£¬ºÜÄÑÕÒµ½ËùÐèµÄÈëÃÅÎÄÕ¡£ËùÒÔ´òËãдµãÎÄÕ£¬¼ÈÄÜ×÷Ϊ×Ô¼ºµÄ×ܽᣬҲÄÜΪÆäËûÈËÌṩЩ°ïÖú¡£Èç¹ûÕâЩÎÄÕÂÄܰﵽÄ㣬ÎҾͷdz£µÄ¿ªÐÄ¡£µ±È»£¬ÕâЩÎÄÕµÄÖÊÁ¿¿Ï¶¨ÓкÃÓлµ£¬»¶Ó´ó¼ÒÌáÒâ¼û£¬Èç¹ûÓÐʱ¼ä£¬ÎÒ»á¼ÌÐøÐ޸ġ£
È»ºó£¬ÎÒÏë˵һÏÂдÕâÀàÎÄÕµÄÄѵ㣬Ö÷ÒªÊÇÒª±£Ö¤Ï¸½Ú¶¼ÊÇÕýÈ·µÄ£¬È»ºóÓÖ²»ÄÜÌ«†ªà¡£
ϸ½Ú¶¼ÊÇÕýÈ·µÄ¡£¾Ù¸öÀý×Ó£¬´óѧµÄºÜ¶àÊý¾Ý½á¹¹½Ì²ÄÖеĴúÂ룬ÄãÖ±½ÓÌùµ½µçÄÔÉÏ£¬È»ºó±àÒ룬´ó²¿·ÖÊDZàÒ벻ͨ¹ýµÄ¡£Õâ¸ö»áÈóõѧÕ߷dz£¾ÚÉ¥¡£ËùÒÔÎÒÏ£ÍûÄܹ»±£Ö¤ÕâЩÎÄÕÂÀïµÄϸ½Ú¶¼ÊÇÕýÈ·µÄ£¬°üÀ¨Ò»Ð©¹¤¾ßµÄÅäÖã¬Èç¹û¾õµÃÓбØÒª£¬ÎÒÒ²»áÃèÊöÏÂÅäÖõÄ×÷Óã¬ÒÔ¼°ÒªÈ¥ÄÄÀïÕÒ¸ü¶àµÄÐÅÏ¢¡£Èç¹ûÕâ·½ÃæÓÐÒÅ©£¬ÇëºÍÎÒ˵¡£
²»ÄÜÌ«†ªà¡£Õâ8ƪÎÄÕÂÀïÉæ¼°µÄ¿âÓкü¸Ê®¸ö£¬Ã¿¸ö¿âÈç¹û¶¼½²×ÐϸÁË£¬ÄǾͻáÈÃÎÄÕÂÏԵ÷dz£†ªà¡£µ«ÊÇÓÖ²»ÄÜÖ±½ÓÈöÁÕßÈ¥¿´¿âµÄ¹Ù·½Îĵµ£¬ËùÒÔȨºâÄÚÈÝÒ²ÊǺÜÂé·³µÄ¡£Èç¹û¸÷λÓÐÕâ·½ÃæµÄ½¨Ò飬ҲÇëºÍÎÒ˵¡£
Õâ¸öϵÁеÄÎÄÕÂÊǹØÓÚOpenStackµÄ»ù´¡ÖªÊ¶£¬ÆäʵOpenStack¿ª·¢»¹ÒªÉæ¼°µ½ºÜ¶àÆäËûµÄ֪ʶ£¬±ÈÈçÏûÏ¢¶ÓÁС¢·Ç×èÈûIOµÈ£¬¶øÇÒ»¹ÒªÁ˽âÕû¸öOpenStackµÄ¿ª·¢Éú̬£¬°üÀ¨GerritÆÀÉóϵͳ¡¢Zuul³ÖÐø¼¯³É¡¢devstack¿ª·¢»·¾³¡¢osloÏîÄ¿µÈ¡£ |