
éãè¯ãã補åãå€éšãµãŒãã¹ã«æå°éã®äŸåé¢ä¿ãæã£ãŠããå Žåã§ãããã®å éšã¯ã³ã³ããŒãã³ãïŒãžã£ã³ã«ã®ããã¯ãšã³ã/ããã³ããšã³ãïŒã«åå²ãããŠããå¯èœæ§ãé«ããããåå¥ã«ãã¹ãã§ããŸãã ããã¯ãå€éšäŸåé¢ä¿ãæ¢ã«é£æ¥ã³ã³ããŒãã³ãã®APIã§ããããã®éçºããŒã ããã®ç¶æ ã管çããããŒã«ãæäŸããããšããŸã£ããæãã§ããªãããšãæå³ããŸãã
ç§ã®èŠ³å¯ã«ãããšããã¹ãããŒã ã¯èªåãã¹ãã®æãåºæ¬çãªã±ãŒã¹ã«éå®ããå€éšã·ã¹ãã ã®åäœãåå®çŸ©ã§ããªãããšã説æããŠããŸãã
å€éšã·ã¹ãã ã®APIãã¢ãã¯ãããšããã®åé¡ã解決ã§ããŸãã
éåžžããã®æç¹ã§ããã¹ã¿ãŒã¯æ²ãã¿ãæãå§ããŸãã åã®æã¯ãèªåãã¹ãèªäœã«å ããŠãæ©èœçã«å€éšã·ã¹ãã ãè€è£œãããµãŒãã¹ãäœæããå¿ èŠããããããã«å ããŠããã¹ãã«å¿ããŠåããªã¯ãšã¹ãã«ç°ãªãããã«å¿çã§ããããã«äœããã®ç¶æ ã管çããå¿ èŠãããããšãæå³ããŸãã±ãŒã¹ã
ãã®èšäºã§ã¯ã Mountebankã«ã€ããŠèª¬æããŸããããã¯ãç¬èªã®WebãµãŒãã¹ãäœæããããšãªããèªåãã¹ãããçŽæ¥ãè¿ éãã€éåžžã«æè»ã«APIãã©ããã§ããããŒã«ã§ãã
Mountebankã®æ©èœïŒ
- tcpãhttpãhttpsãsmtpãããã³ã«ã§APIãé衚瀺ã«ããŸãã
- ç¡å¶éã®æ°ã®APIãåæã«æ¿¡ããã
- mountebankã®æ§æAPIã䜿çšãããã¹ãäžã®ã¢ãã¯APIããžãã¯ã®æè»ãªåå®çŸ©ã
- å€éšãµãŒãã¹APIãžã®ãªã¯ãšã¹ãã®ãããã·ãå¿çããã³ãã®åŸã®ã¢ãã¯APIã§ã®äœ¿çšã®å¯èœæ§ã®ä¿åã
- ã»ãšãã©ã®ããã°ã©ãã³ã°èšèªïŒJSãPythonãRubyãJavaããã®ä»å€æ°ïŒã®ã¯ã©ã€ã¢ã³ãã©ã€ãã©ãªã
ã³ã³ã»ãã
mountebankã®æ ¹åºã«ããèãæ¹ã¯ã·ã³ãã«ã§ç¬åµçã§ãïŒãã¹ãŠã®ãã¹ãã±ãŒã¹ã«å¯ŸããŠ1ã€ã®ãŠãããŒãµã«ã¢ãã¯APIãäžåºŠã«èšè¿°ããå¿ èŠã¯ãããŸãããç¹å®ã®ãã¹ãã±ãŒã¹ãå¿ èŠãšããç¯å²ãŸã§åãã¹ãã®åã«ã¢ãã¯APIã®åäœãåå®çŸ©ããæ¹ãå¹ççã§ãã
Mountebankã¯ããã¹ããµã€ãã«å±éãããç¬èªã®Web APIãæã€WebãµãŒãã¹ã§ãã ãã®APIæ§æãåŒã³åºããŸãã æ§æAPIã¯ãmock-APIã«é 眮ããããžãã¯ãmountebankã«äŒããã®ã«åœ¹ç«ã¡ãŸãã ãã®åŸãmountebankã¯åœè£ è ãã€ãŸãã¢ãã¯APIãå®è£ ããWebãµãŒãã¹ãéžæããŸãã åæã«ãmountebankã¯ãè©æ¬ºåž«ã®è¡åãåå®çŸ©ããé »åºŠãå¶éããŸããã
ã€ãŸããåãã¹ãã®åã«æååãåå®çŸ©ããç¹å®ã®ãã¹ãã«å¿ èŠãªããžãã¯ãæ£ç¢ºã«èšè¿°ããããšãã§ããŸãã ãããŠãã以äžäœããªãïŒ
èšçœ®ãšæåã®æ¹¿åŒæ³
mountebankã®ç¥èã¯ãã€ã³ã¹ããŒã«ããå§ããå¿ èŠããããŸãã ããã¯node.jsã¢ããªã±ãŒã·ã§ã³ã§ãããããnpmã䜿çšããŠãããè¡ãã®ãæãè«ççã§ãïŒäºåã«ã€ã³ã¹ããŒã«ãããnode.jsãå¿ èŠã§ãïŒã
>npm install -g mountebank
node.jsãåå¥ã«ã€ã³ã¹ããŒã«ããããªãå Žåã¯ã ãã©ãããã©ãŒã ããšã«å¥ã®æ¹æ³ããããŸã ã
次ã«ãã³ã³ãœãŒã«ããmountebankãå®è¡ããŸãã
>mb
ããã©ã«ãã§ã¯ãmountebankã¯ããŒã2525ãå æããŸãããã¹ãŠãæ£åžžãªå Žåã¯ãæšæ¶ã衚瀺ãããŸãã

mountebankèªäœã®æ§æAPIããã³ã°ããŠããã®ã¯ãlocalhostïŒ2525ã§ãã
ãã¬ãŒãã³ã°ããã«ã¯ãPOST /ãã¹ãã¡ãœãããå®è£ ããåçŽãªåœè ãäœæãããªã¯ãšã¹ãæ¬æã«ãªããžã§ã¯ããå«ãJSONãå«ãŸããŠããå Žå
{ âmessageâ: âpingâ }
次ã«ãJSONãå¿çãšããŠéä¿¡ããå¿ èŠããããŸãã
{ âmessageâ: âpongâ }
ãã以å€ã®å Žåã¯ãã¹ãŠã400ã¹ããŒã¿ã¹ïŒäžè¯ãªã¯ãšã¹ãïŒãè¿ããŸãã
ç§ãã¡ã¯mountebankãšéä¿¡ãã PostmanãéããŠè©ç§°ããŸãã
ãªãããŸããäœæããã«ã¯ãmountebankæ§æAPIã«æ¬¡ã®ãªã¯ãšã¹ããéä¿¡ããŸãã
è©æ¬ºåž«ãäœæããããã®èŠæ±ãäœã§æ§æãããŠãããã«ã€ããŠã®ããã€ãã®èšèã
ãŸããè©æ¬ºåž«ãåäœãããããã³ã«ãšãååããããŒãã瀺ããŸãã ããã¯ãã¢ãã¯APIãäžæããããŒãã«ãªããŸãã 次ã¯ã¹ã¿ãã®é åã§ããç¹å®ã®çä¿¡ãªã¯ãšã¹ãã«ã©ã®ããã«å¿çããããè©ç§°ããããã®ã«ãŒã«ã§ãã
åã«ãŒã«ã¯ãè¿°èªãšå¿çã§æ§æãããŸãã
- è¿°èªã¯ãè©æ¬ºåž«ãããã«å¿çããããã«çä¿¡ãªã¯ãšã¹ããäžèŽããªããã°ãªããªããã©ã¡ãŒã¿ãèšè¿°ããŸã
- å¿çã¯ãçä¿¡èŠæ±ãè¿°èªãšäžèŽããå Žåã«è©æ¬ºåž«ã«ãã£ãŠéä¿¡ãããå¿çãèšè¿°ããŸãã
åãåãããè©æ¬ºåž«ã«å°çãããã³ã«ããªã¯ãšã¹ããžã®æºæ ã«é¢ããç¬èªã®ã«ãŒã«ã«åŸã£ãŠå®è¡ãããŸãã èŠæ±ãã«ãŒã«ã®è¿°èªãæºããå Žåãé©åãªå¿çãèŠæ±ã§çæãããã«ãŒã«ã®ãããªããã€ãã¹ãçµäºããŸãã
è©æ¬ºåž«ãã©ã®ããã«æ©èœããããããã£ãã®ã§ãä»åºŠã¯ããããã¹ãããŸãã
æåã®ã«ãŒã«ã«äžèŽãããªã¯ãšã¹ããè©æ¬ºåž«ã«éä¿¡ããŸãã
ãããŠçããåŸãïŒ
次ã«ãæåã®ã«ãŒã«ã«äžèŽããªããªã¯ãšã¹ããéä¿¡ããŠã¿ãŸããããã€ãŸãã2çªç®ã®ã«ãŒã«ã«è©²åœããŸãã
å¿çãšããŠã400 Bad RequestãåãåããŸãã
ãã¹ãŠãæ©èœããŸãïŒ
åè©æ¬ºåž«ã«ã¯ãç¡å¶éã®æ°ã®ã«ãŒã«ãå«ããããšãã§ããŸããã€ãŸããããŸããŸãªèŠæ±ã«å¯Ÿããããªãè€éãªåäœããžãã¯ãçµã¿èŸŒãããšãã§ããŸãã
åæã«ãmountebankã¯ããŸããŸãªããŒããšãããã³ã«ã§åæã«å€ãã®imposter'ovãä¿æã§ãããããè€æ°ã®å€éšAPIãäžåºŠã«æ¿¡ããããšãã§ããŸãã
èªåãã¹ãã®ã¢ããªã±ãŒã·ã§ã³
mountebankã®ä»çµã¿ãå€ããå°ãªããæ確ã«ãªã£ãã®ã§ãããã§å®ããããæŠå¿µãå®å šã«æããã«ãªã£ãå Žæãã€ãŸãèªåãã¹ãã«é©çšããŠã¿ãŸãããã
éè¡ã®ãŠã§ããµã€ããATMãã«ãŒãã«è¡šç€ºããæ©èœããã¹ãããŠãããšããŸãã ãã®æ©èœãå®è£ ããããã«ãfrontã¯ãµãŒããŒã«èŠæ±ãéä¿¡ããŠATMã®åº§æšãååŸããå¿çãåä¿¡ãããšããããããããã«è¡šç€ºããŸãã
ãã®æ©èœã®ãã¹ãã¯ã2ã€ã®ã·ããªãªãæå³ããŸãã
- frontã¯æå¹ãªåº§æšãæã€ATMã®ãªã¹ããåãåããŸããïŒãããããã¹ãŠå°å³äžã«æ£ãã衚瀺ããããšæåŸ ããŠããŸãã
- frontã¯ATMã®ãªã¹ããåãåããŸããããäžéšã®åº§æšã¯ç¡å¹ã§ããæå¹ãªåº§æšãæã€ATMã®ã¿ã衚瀺ããããšäºæ³ãããŸãã
ã©ã¡ãã®å Žåã§ãããã¹ããããããŒãžã¯åããªã¯ãšã¹ããããã¯ãšã³ãã«éä¿¡ããŸãïŒGET / api / pointsã
APIããã¯ãšã³ããããã¯ããã«äž¡æ¹ã®ã±ãŒã¹ãæ€èšŒããããšã¯äžå¯èœã§ããäž¡æ¹ã®ã±ãŒã¹ã®ããã¯ãšã³ãã¯ããããã®ã±ãŒã¹ãæºãããªãåããã€ã³ãã»ãããè¿ããŸãã
ç¹å®ã®ããŒã¿ã»ãããæäŸããç¬èªã®ãµãŒãã¹ãäœæããå Žåã§ãã1ã€ã®ã±ãŒã¹ã®ã¿ãèªåçã«ãã§ãã¯ã§ããŸãã
次ã«ãmountebankã䜿çšããŠãããã®ãã¹ãã±ãŒã¹ãèªååããæ¹æ³ãèŠãŠã¿ãŸãããã
ãã¢ã³ã¹ãã¬ãŒã·ã§ã³ã«ã¯ãpython + pytestãã³ãã« ïŒåŒ·åãªãã£ã¯ã¹ãã£ãµãã·ã¹ãã ãåãããã¹ããã¬ãŒã ã¯ãŒã¯ïŒã䜿çšããŸãã
import pytest import requests import json from page_objects import MapPage # valid_points = { "point_1": (55.999653, 37.206002), "point_2": (55.996767, 37.184545), "point_3": (55.984932, 37.208749), } # invalid_points = { "point_1": (255.999653, 37.206002), "point_2": (55.996767, 237.184545), "point_3": (55.984932, 37.208749), } # @pytest.fixture( scope='module', params=[valid_points, invalid_points], ids=['Valid points case', 'Invalid points case'] ) def fxtr_map(request): points = request.param # imposter'a imposter_cfg = { "port": 1987, "protocol": "http", "stubs": [ { "predicates": [ { "equals": { "method": "GET", "path": "/api/points" } } ], "responses": [ { "is": { "statusCode": 200, "headers": {"Content-Type": "application/json"}, "body": points } } ] } ] } # mountebank imposter'a requests.request('POST', 'http://localhost:2525/imposters', data=json.dumps(imposter_cfg), headers={"content-type": "application/json"}) # ( ) browser = webdriver.Chrome() browser.implicitly_wait(10) browser.get(MAP_PAGE_URL) map_page = MapPage(browser) # points_to_check = {k: points[k] for k in points if points[k] == valid_points[k]} # # yield map_page, points_to_check browser.close() # , def test_points_on_map(fxtr_map): map_page, points_to_check = fxtr_map # assert map_page.check_points(points_to_check)
å§ããŸãã

åºæ¥äžããïŒ
mountebankã®ãããã§ãç¹å®ã®ãã€ã³ãã»ãããåŸãããããã«ãã£ã¯ã¹ãã£ããã¢ãã¯APIãçŽæ¥æ§æããã¢ãã¯å¯Ÿè±¡ã®ã¡ãœããã«åãããããã¹ãããŒãžãåŒãåºããŠãèšå®ãããã€ã³ããååŸããŸããã ããŠããã¹ãæ©èœã§ã¯ãæå¹ãªãã€ã³ãã®ã¿ããŠãŒã¶ãŒã®ç»é¢ã«è¡šç€ºãããããšã確èªããŸããã pytestã¯ãã£ã¯ã¹ãã£ããã©ã¡ãŒã¿åããæ©èœãããããã2ã€ã®ãã¹ããèšè¿°ããå¿ èŠããããŸããã§ãããäž¡æ¹ã®ãã¹ãã±ãŒã¹ã1ã€ã®ãã£ã¯ã¹ãã£ãš1ã€ã®ãã¹ãã§ã«ããŒãããŠããŸãã
äžèšã®äŸã§ã¯ãmock-APIã¯mountebank Web APIãä»ããŠçŽæ¥æ§æãããŸããã å®éã®ãããžã§ã¯ãã§ã¯ãå€ãã®ã¯ã©ã€ã¢ã³ãã©ã€ãã©ãªãèšè¿°ãããŠããé«ãã¬ãã«ã®æœè±¡åã§mountebankã䜿çšããããšããå§ãããŸãã pythonã®ã¿ã®å Žåããã§ã«3ã€ãããŸãã ãæ°ã«å ¥ãã®èšèªãååšããã¯ãã§ã ã
ãã®èšäºã§ã¯ãmountebankã®æ©èœã®ã»ãã®äžéšã®ã¿ã瀺ããŸããã è©æ¬ºåž«ãæ±ãããã®ãã®ä»ã®åºæ¬çãªãªã¯ãšã¹ãã«å ããŠãå€éšã·ã¹ãã ã®APIãžã®ãªã¯ãšã¹ãã®ãããã·ã tcpãããã³ã«ã¬ãã«ã§ã®ã¢ãã¯ãjsã€ã³ãžã§ã¯ã·ã§ã³ãªã©ã®åŒ·åãªæ©èœãæªè§£æ±ºã®ãŸãŸã§ããã
ãããã£ãŠããã®ããŒã«ã«èå³ãããå Žåã¯ãããŒã«ã®ååã«äžèŽããããã«éåžžã«æ©ç¥ã«å¯ãã èšèªã§æžãããããã¥ã¡ã³ã ïŒmountebank-ïŒè±èªïŒããããªãã¯ã¹ã¿ãŒïŒãžããããã