IVRy ã®ã¢ãã€ã«ã¢ããªã®é話èªåãã¹ããžã®åãçµã¿
IVRy ã§ QA ãšã³ãžãã¢ãããŠããé¢ ( @IvryQa )ã§ãã
IVRyã§ã¯ãã¢ãã€ã«ã¢ããªïŒiOS / AndroidïŒãæäŸããŠããããããã®QAãèªååãæ
åœããŠããŸãã
ã¢ãã€ã«ã¢ããªã§ã¯ãçºçä¿¡ãäžåšéç¥ã®ç¢ºèªããŠã£ãžã§ããããã®é»è©±å±¥æŽç¢ºèªãªã©ãæ¥ã
ã®æ¥åã§äœ¿ãããæ©èœãæèŒãããŠããŸãã
é»è©±æ©èœ

ãŠã£ãžã§ããæ©èœ

ãã®ã¢ãã€ã«ã¢ããªã® QA ãé²ããäžã§ãOS ã端æ«ã«ããããªãšãŒã·ã§ã³ã®å€ãã«å ããçºçä¿¡ã®ããã«å®éã«é»è©±ããããŠæåã確èªããã±ãŒã¹ãå€ããæåãã¹ãã®è² æ ã倧ãããªã£ãŠããŠããŸãã
ããã§ããã¹ãã«ãããå·¥æ°ãæ¹åãããããã¢ãã€ã«ãšã³ãžãã¢ã®ã¡ã³ããŒã«ãååããŠããããªãããã¢ãã€ã«é åã®èªåãã¹ãç°å¢ãæŽããåãçµã¿ãé²ããŠããŸããã
ä»åã®èšäºã§ã¯ãããããã¢ãã€ã«ã¢ããªç¹æã®äºæ ãèžãŸãã€ã€ãã©ã®ããã«èªååãå®çŸããŠãã£ãã®ãããã®éçšã工倫ããŸãšããŠããŸãã
ã¢ãã€ã«ã¢ããªã®äžã§ãé話æ©èœã絡ããã¹ãã¯ãWeb ã¢ããªåãã® E2E ãã¹ã[1] ãšã¯ãŸã£ããæ§è³ªãç°ãªããç§èªèº«ããã®é åã«çŽ1幎ã»ã©è©Šè¡é¯èª€ããªããåãåã£ãŠããŸãããåããããªèª²é¡ã«åãçµãã§ããæ¹ãžã®åèã«ãªãã°å¹žãã§ãã
å°å ¥ã®èæ¯ãšç®ç
IVRyã®ã¢ãã€ã«ã¢ããªéçºã¯ãããå幎ã§ãšã³ãžãã¢ã¡ã³ããŒãå¢ããŠãå éãããªãªãŒã¹é »åºŠãäžãã£ãŠããŸãããæ°æ©èœã ãã§ã¯ãªãããªãã¡ã¯ã¿ãªã³ã°ãã©ã€ãã©ãªæŽæ°ãå¢ãããã®åºŠã«è¡ããªã°ã¬ãã·ã§ã³ãã¹ãã®å·¥æ°ã倧ãããªã£ãŠããŸãã
ãŸããiOS / Android ã®äž¡ãã©ãããã©ãŒã ã«å¯Ÿå¿ããŠãããããOS ã端æ«ã«ããæåã®éããç¡èŠã§ããŸãããæãã¬åœ±é¿ç¯å²ãåºãããšãããã確èªãã¹ããã¿ãŒã³ã¯å€å²ã«ããããŸããããã«é»è©±ã¯ç€ŸäŒã€ã³ãã©çãªæ§è³ªã匷ãã"ã€ãªããããš" ãåæã®ããã確å®ãªåäœç¢ºèªãæ±ããããŸãã
ããããèæ¯ãããQAãããã«ããã¯ã«ãªãããšãé¿ããéçºè ãå¹ççã«ãã¹ãã§ããããããªã°ã¬ãã·ã§ã³ãã¹ãã®èªååã¯å¿ é ã ãšæããŠããŸãããäžé·æçã«ã¯æ¬¡ã®3ç¹ãå®çŸã§ããç¶æ ãç®æãããªã°ã¬ãã·ã§ã³ãã¹ãã®èªååã«åãçµã¿å§ããŸããã
- ãªãªãŒã¹æã®ãªã°ã¬ãã·ã§ã³ãã¹ãã®å¹çå
- éçºåŽã§ãã»ã«ããã§ãã¯ã§ããä»çµã¿ã®æ§ç¯ïŒå¯èœã§ããã°ãã«ãçŽåŸã§ã®æ©æã«äžå ·åãæ€ç¥ããïŒ
- iOS / Android ã®ã¯ãã¹ãã©ãããã©ãŒã æ€èšŒãå¹çåãã
èªååãé²ããããã§èŠããŠãã課é¡
ã¢ãã€ã«ã¢ããªãç¹ã«é»è©±æ©èœãå«ãé åã®èªåãã¹ããé²ããã«ããã£ãŠå€§ããªå£ããããŸããããŸãã¯ã Appium[2] ã Maestro[3] ãã¯ãããšããã¢ãã€ã«åãã® E2E ãã¹ãåºç€ããããŒã³ãŒãç³»ã®èªåãã¹ããµãŒãã¹[4] ã§å®çŸã§ããªããæ€èšŒããŸãããããããã課é¡ããããŸããã
ãããã®ããŒã«ã¯åæãšã㊠ã¢ããªå ã§å®çµãã UI æäœ ãæ³å®ããŠãããããOS æšæº UIïŒçä¿¡ç»é¢ã»é話 UI ãªã©ïŒãçä¿¡ã®ä»çµã¿ã®ããã«ãã¢ããªå€ã§åŠçãããèŠçŽ ãæäœã§ããŸããããã®çµæãæåŸ ããŠãããããªé話é åã®èªååã¯å®çŸã§ããŸããã§ããã
â«ïž ã¢ã€ããªãŒã¢ããªã®çä¿¡æãšé話æã®æåã€ã¡ãŒãž

â«ïž åããŒã«ã§å®çŸã§ããããšã»ã§ããªãã£ãããš
â»æ€èšŒé
ç®ã¯ä»ã«ããããŸãããæ€èšŒæéãéãããŠãããããé»è©±æ©èœããŠã£ãžã§ããæ©èœã«çµã£ãŠæ€èšŒãé²ããŸããã
| ãã¹ãã±ãŒã¹ | åªå 床 | å¿ é | Appium | Airtest | CodeceptJS | |||
|---|---|---|---|---|---|---|---|---|
| iOS | Android | iOS | Android | iOS | Android | |||
| èŠçŽ ãã§ã㯠| é« | â | ||||||
| ã»ç¹å®ã®èŠçŽ ã衚瀺ãããŠããã | âªïž | âªïž | âªïž | âªïž | âªïž | âªïž | ||
| ãŠã£ãžã§ãã | äž | â² | ||||||
| ã»é»è©±å±¥æŽã衚瀺ãããŠããã | à | à | â | â | à | à | ||
| æ¬äººç¢ºèªïŒã«ã¡ã©ïŒ | äœ | |||||||
| ã»æ¬äººç¢ºèªã®ã«ã¡ã©ã§æ®åœ±æã®èªåå | - | - | - | - | - | - | ||
| é»è©±ïŒçºä¿¡ïŒ | é« | â | ||||||
| ã»çºä¿¡ | à | à | â | â | à | à | ||
| é»è©±ïŒçä¿¡ïŒ | é« | â | ||||||
| ã»çä¿¡ïŒéç¥ã®ãããã¢ããã衚瀺ããããïŒ | à | à | â | â | à | à | ||
| é»è©±ïŒç«¯æ«èšå®ïŒ | äœ |
課é¡ãèžãŸããŠãã©ãçããã®ã Airtest
ããŸããŸãªE2EããŒã«ãæ€èšŒããŠè¡ã£ãçµæãæçµçã« ãããªãé話é åã®èªååãã§ãããããããªã ãšå€æããã®ã Airtest ã§ããã
Airtest ã¯ãã¢ããªå
ã ãã§ãªã OS ã衚瀺ããé話 UI ãŸã§ãç»åãšããŠæ€åºã»æäœã§ãããããé話æ©èœãå«ã IVRy ã®ã¢ãã€ã«ã¢ããªç¹æã®å¶çŽãé¿ããŠãã¹ããè¡ãããšãã§ããŸããã
Airtest ãšã¯
Airtest[5] 㯠Python ããŒã¹ã®ã¹ã¯ãªããã§åäœãããã¬ãŒã ã¯ãŒã¯ã§ãAndroid / iOS ã®äž¡ãã©ãããã©ãŒã ãã«ããŒããŠããŸãã
ã²ãŒã ã®èªåãã¹ãã§ãã䜿ãããããšãããè€é㪠UI ã®ç»åèªèã«åŒ·ãã®ãç¹åŸŽã«ãªã£ãŠããŸãã
ã¢ãã€ã«åãã®ãã¹ããã¬ãŒã ã¯ãŒã¯ã¯ã ã¢ããªãæç»ããŠãã UI ã³ã³ããŒãã³ã ãåæã«æäœããŸãããAirtest 㯠OS ã衚瀺ãã UIïŒçä¿¡ç»é¢ãéç¥ããã€ãã£ãã®é話 UI ãªã©ïŒãç»åãšããŠæ±ãã ãããåŸæ¥ã®ããŒã«ã§ã¯è§Šããªãã£ãé åãŸã§èªååã§ããç¹ã倧ããªåŒ·ã¿ãšãªã£ãŠããŸãã
ããšãã°ãAndroid ã®çä¿¡ç»é¢ã§è¡šç€ºãããç·è²ã® å¿ç ãã¿ã³ããAndroid ã®ã¹ã¯ã€ãæäœãªã©ãAirtestãªãç»åèªèã«ãã£ãŠçŽæ¥æ±ãããšãã§ããŸãã

ããã« Airtestã¯å®è¡çµæãšããŠãæãããããšã®ã¹ã¯ãªãŒã³ã·ã§ããããã°ããŸãšããã¬ããŒããèªåçæããŠãããŸãã

ããã«ããã
- OS æšæº UIïŒçä¿¡ç»é¢ã»é話 UI ãªã©ïŒ
- ããã·ã¥éç¥
- ã¢ããªå€ã§è¡šç€ºããããããã¢ããïŒçä¿¡æã«å šç»é¢è¡šç€ºãããç»é¢ïŒ
ãšãã£ããåŸæ¥ã®ãã¹ãããŒã«ã§ã¯æäœã§ããªãã£ãé åãŸã§ã«ããŒã§ããããã«ãªããŸããã
å šäœçãªæ§æ
é話ãŸããã® E2E ãã¹ãã¯ãGitHub Actions â å®è¡çšãã·ã³ â 宿©ç«¯æ« ãšããæµãã§åããæ§æã«ããŠããŸãã
Airtest ãå©çšããäžã§ããšãã¥ã¬ãŒã¿ãŒã宿©ç«¯æ«ãªã©éžæè¢ã¯ãããŸãããä»å㯠ãšãã¥ã¬ãŒã¿ãŒã§ã¯ãªãã宿©ç«¯æ«ãçŽæ¥æ¥ç¶ããŠãã¹ããå®è¡ããéçš ãæ¡çšããŸããã
å°æ¥çã« é話äžã®é³å£°å ¥åºåã察話ããžãã¯ã®æ€èšŒ ã«ãåºããŠããããããšããããŠãŸã㯠å°ããå§ããŠç¢ºå®ã«åã圢ãäœãããã£ã ããšãçç±ã§ãã
ãã¹ãå®è¡ãããŒïŒå šäœå³ïŒ
- GitHub ActionsïŒã»ã«ããã¹ãã©ã³ããŒïŒ [6] ãã Airtest ã®å®è¡ã¹ã¯ãªãããèµ·å
- ã»ã«ããã¹ãã©ã³ããŒäžã® Airtest ã 宿©ïŒiOS / AndroidïŒãæäœ
- ãã¹ãå®äºåŸãçµæãSlack ãžéç¥ïŒGitHub Actionsã®å®è¡çµæãäžç·ã«éç¥ïŒ
çŸåšã¯æåããªã¬ãŒã§ãã¹ããå®è¡ããŠããŸãããä»åŸã¯ã¢ããªã®ãã«ãå®äºãããªã¬ãŒã«èªåå®è¡ãããããã«ããããšãæ€èšããŠããŸãã
ãã«ãçæçŽåŸã«é話ãŸããã®æåãæ€èšŒã§ããããã«ããããšã§ãåé¡ã®æ©ææ€ç¥ãšãã£ãŒãããã¯ãµã€ã¯ã«ã®ççž®ã«ã€ãªããçãã§ãã
å®éã«èªååããŠãããã¹ãã±ãŒã¹äŸ
é話æ©èœãŸããã§å®éã«èªååããŠããã·ããªãªã®äžäŸãšããŠãAndroid 宿©ããã®çºä¿¡ãã¹ãã玹ä»ããŸãã

ãã®ãã¹ãã§ã¯ãã¢ããªãããã¹ãçšã® 050 çªå·ã«çºä¿¡ãã以äžãç»åèªèããŒã¹ã§æ€èšŒããŠããŸãã
- ã¢ããªåŽã§ã®çºä¿¡ç»é¢é·ç§»
- ãã€ã€ã«ãããäžã®é»è©±çªå·ãæåŸ ã©ãã衚瀺ãããŠããããš
- OS ã®é話 UI ã§é話äžãã€ã¢ãã°ã衚瀺ãããããš
- çµè©±åŸãã¢ããªãã¯ã©ãã·ã¥ããåäœããŠããããš
# Android 宿©ããã®çºä¿¡ãã¹ãïŒæç²ïŒ
from airtest.core.api import (
Template,
touch,
assert_exists,
sleep,
)
from common.android_operations import (
AndroidOperations,
setup_android_device_connection,
setup_device_specific_images,
)
IVRY_STG_PACKAGE = "xxx"
OUTGOING_NUMBER = "xxx" # ãã¹ãçšçªå·
# 端æ«åºæã®ç»åãã¹ãèšå® & ããã€ã¹æ¥ç¶
setup_device_specific_images()
setup_android_device_connection(__file__)
android_ops = AndroidOperations(IVRY_STG_PACKAGE)
def test_outgoing_call():
"""ã¢ããªããã®çºä¿¡ãé話確èªãçµè©±ãŸã§ãè¡ã E2E ãã¹ã"""
# ã¢ããªèµ·å
if not android_ops.ensure_app_running():
raise RuntimeError("ã¢ããªã®èµ·åã«å€±æããŸãã")
# çºä¿¡ç»é¢ãéã
def open_dialer():
touch(Template("dial.png"))
android_ops.safe_operation(open_dialer)
# é»è©±çªå·ãå
¥å
def input_phone_number():
for digit in OUTGOING_NUMBER:
touch(Template(f"dial_{digit}.png"))
android_ops.safe_operation(input_phone_number)
# å
¥åããçªå·ãæ£ããããšãç»åã§æ€èšŒ
assert_exists(
Template("outgoing_number_on_keypad.png", threshold=0.95),
"ãã€ã€ã«ãããäžã®é»è©±çªå·ãæåŸ
å€ãšç°ãªããŸã",
)
# çºä¿¡ãã¿ã³ãã¿ãã
def start_call():
touch(Template("dial_start.png"))
android_ops.safe_operation(start_call)
# é話éå§ãåŸ
æ©ïŒå®éã«ã¯ã¿ã€ããŒãªã©ã§å€å®ããŠãããïŒ
sleep(10)
# é話äžãã€ã¢ãã°ã®è¡šç€ºã確èª
def check_call_dialog():
assert_exists(
Template("call_to_dialog.png"),
"é話äžãã€ã¢ãã°ã衚瀺ãããŠããŸãã",
)
android_ops.safe_operation(check_call_dialog)
# çµè©±
def end_call():
touch(Template("dial_end.png"))
android_ops.safe_operation(end_call)
# é話çµäºåŸãã¢ããªãçããŠããããšã確èª
assert android_ops.is_app_running(), "çµè©±åŸã«ã¢ããªãã¯ã©ãã·ã¥ããŠããŸã"
å°å ¥ããŠããã£ããã€ã³ã
çºä¿¡ã»çä¿¡ãŸããã®èªåãã¹ããå®çŸå¯èœã«ãªã£ãããš
ãããäžçªå€§ããææããªãšæããŸãïŒ
çºä¿¡ãçä¿¡ãŸããã® UI ã¯ã¢ããªã§ã¯ãªã OS åŽã§æç»ããã仿§ã®ãããäžè¬çãªã¢ãã€ã«åã E2E ããŒã«ã§ã¯æäœã§ããŸããããã®éšåããã£ãšããã¯ã«ãªã£ãŠããŠãAppium ã MaestroãããŒã³ãŒãç³»ãµãŒãã¹ãªã©ãèŠã€ããããŒã«ã¯ã²ãšéã詊ããŠããã®ã§ãããã©ããé話ãŸããã®æäœãŸã§ã¯å¯Ÿå¿ã§ãããé·ãããã æè©°ãŸããç¶ããŠããŸããã
ãããªäžã§ãååããŠãããã¡ã³ããŒã®ç¥èŠããã Airtest ã«ãã©ãçããããšã§ãOS ãæç»ãã UI ãç»åèªèã§æ±ããããã«ãªããçºçä¿¡ãŸããã®èªååã«çŸå®çãªéãéããããšãã§ããŸããã
çŸç¶ã¯æ¯èŒçã·ã³ãã«ãªã·ããªãªããéçšãå§ããŠããŸãããä»åŸã¯ããè€éãªã±ãŒã¹ãæ°æ©èœãå«ããŠèªååã®å¹ ãåºããããèŠèŸŒã¿ãç«ã£ãããšã倧ããã§ãã èªååã§ããªããšæã£ãŠããé åã«åžæãèŠããããšã¯ãä»åã®åãçµã¿ã®äžã§ãç¹ã«å€§ããªåç©«ã§ããïŒ
èŸããã€ã³ã
E2E ãã¹ãç¹æã® å®è¡æéãé·ããªã ãšãã£ã倧å€ãããããŸãããä»åã®ä»çµã¿ãªãã§ã¯ã®èŸããšããŠã¯ã倧ããäºã€ãããŸãã
äžã€ç®ã¯ãã¡ã³ããã³ã¹ãéããªããã¡ãªç¹ã§ãã
Airtest ã¯ç»åèªèããŒã¹ã®ãããOS ã¢ããããŒãã§ UI ãå€ãã£ãããã¢ããªåŽã®ç»é¢ãã¶ã€ã³ã倿Žããã ãã§ãããã¹ãããã®åœ±é¿ãåããŸããããã«ã端æ«ããšã®ç»é¢ãµã€ãºãè§£å床ã®éãã«ãã£ãŠãã¿ã³ã®èŠãæ¹ã埮åŠã«å€ããããšãããããã®ãã³ã«ãã£ããã£ãåãçŽããããç»åãå·®ãæ¿ãããããå¿
èŠãåºãŠããŸãã
äºã€ç®ã¯ã誀æäœã®ãªã¹ã¯ã§ãã
ç»åèªèã¯åŒ·åãªäžæ¹ã§ãããããªäœçœ®ãºã¬ã衚瀺ã¿ã€ãã³ã°ã®é
ãã«ãã£ãŠãæå³ããªãå Žæãã¿ããããŠããŸãå¯èœæ§ããããŸããç¹ã«çºä¿¡ãã¹ãã§ã¯ãé»è©±çªå·ã®ãã¿ã³ã¿ããããããŠããŸããæ³å®å€ã®çªå·ã«é»è©±ããããŠããŸãå±éºããããŸãããã®ãããå€å®ããžãã¯ãã¬ãŒãåŠçã«ã€ããŠã¯ãããªãæ
éã«èšèšã»éçšããããã«ããŠããŸãã
ä»åŸã®å±æ
ã¢ãã€ã«ã¢ããªã®é話èªåãã¹ãã¯ããŸã ç«ã¡äžã段éã§ãããããåãçµã¿ããé åã課é¡ããããããããŸããåé ã§æãã 3 ã€ã®çãã«å¯ŸããŠããçŸæç¹ã§ã¯é話é åã®äžéšã·ããªãªãèªååã§ãããšãããŸã§ã§ããªãªãŒã¹åã®ãªã°ã¬ãã·ã§ã³ãã¹ãå šäœã眮ãæããããã»ã©ã®ã«ãã¬ããžããéçºåŽã®ã»ã«ããã§ãã¯çšã®èªåå®è¡ãŸã§ã¯è³ã£ãŠããªãç¶æ³ã§ãã
ãŸã㯠iOS/ Android ã®ã·ã³ãã«ãªé話ã·ããªãªã§è¶³å Žãåºãã€ã€ãCI ãžã®çµã¿èŸŒã¿ãªã©æ®µéçã«é²ããŠããæ³å®ã§ããããããåæããµãŸãã€ã€ãä»åŸã¯æ¬¡ã®ãããªåãçµã¿ãé²ããŠãããããšèããŠããŸãã
â çºè©±ãã¹ãã®èªåå
ä»åã¯ãçä¿¡ â å¿ç â çµè©± ã ã¢ããªããã®çºä¿¡ ãšãã£ãã·ã³ãã«ãªæäœãããŒã¹ã«ã·ããªãªãäœæããŠããŸãããå®éã«ã¯ãé話äžã®å¯Ÿè©±ãŸã§å«ããæ€èšŒãå¿
èŠã«ãªããŸãããããã£ãéšåã«é¢ããŠãèªåãã¹ãã§ããããã«ããããšèããŠããŸãããã ãé³å£°å
¥åãã©ãæ±ããã倧ããªèª²é¡ã§ãçŸç¶ã§ã¯ç¢ºç«ãããæ¹æ³ãèŠã€ãã£ãŠããªããã¹ããŒã«ãŒã䜿ã£ãŠé³å£°ãæµããªã©ãããŒããçµã¿åãããæ¹åŒãæ€èšããŠããŸãã
â¡ éè©±ç¶æ
ã»åæçä¿¡ãªã©è€éã±ãŒã¹ãžã®å¯Ÿå¿
ä¿çã転éãåæçä¿¡ãçä¿¡æåŠãé話äžãããã¢ãããªã©ãå®éçšã§ã¯é »ç¹ã«èµ·ããã±ãŒã¹ãèªååã®å¯Ÿè±¡ã«åºããããšèããŠããŸãã
é話ããžãã¯ã¯æ¡ä»¶ãå€ãè€éã§ããããããã«ããŒã§ãããšå質ã®åºäžãã«å€§ããå¯äžããé åã§ãã
⢠ã¡ã³ããã³ã¹å¹çå
ç»åèªèããŒã¹ã®ãã¹ãã§ã¯ UI 倿Žã«ããã¹ãããã·ã§ããæŽæ°ãã©ãããŠãçºçããŸãã
ãã®ããã㯠LLM ã MCP [7] ãæŽ»çšãã
- å·®åã®èªåæ€åº
- æŽæ°ã¹ãããã·ã§ããã®èªåçæ
- PR ã®èªåäœæ
ãªã©ãè¡ãä»çµã¿ãäœããè² è·ã軜æžããããšèããŠããŸãã
⣠é»è©±æ©èœä»¥å€ã®èªåãã¹ãæ¡å
ãŸãã¯é»è©±é åããçæããŠããŸãããã¢ããªå
šäœã§èŠããšèªååã§ããéšåã¯ãŸã ãŸã å€ããããŸãã
æ¢åã®ä»çµã¿ã«ãã ããããããé©ããããŒã«ãæ¹åŒãããã°ç©æ¥µçã«åãå
¥ããªãããé»è©±ä»¥å€ã®é åã«ãåºããŠããäºå®ã§ãã
ãŸãšã
IVRy ã§ã¯ãã¢ãã€ã«ã¢ããªã®å質åäžãšãã¹ãããã»ã¹ã®å¹çåã«åããŠæ¥ã æ¹åãé²ããŠããããã®äžç°ãšããŠä»å玹ä»ãã é話é åã®èªåãã¹ã ã«ãåãçµãã§ããŸãã
çŸåšã¯ã¢ããªããŒã ãšã飿ºããªãããç°å¢ãéçšã®ãã©ãã·ã¥ã¢ãããç¶ç¶çã«é²ããŠããŸããããšãã°ãã¢ããªã®ããŒãžã§ã³ãæå®ããŠã€ã³ã¹ããŒã«ããèªåãã¹ããå®è¡ã§ããä»çµã¿ãªã©ãããéçºãããŒã«çµã¿èŸŒã¿ããã圢ãžãšæ¹åãé²ãã§ããŸãã
ä»åã¯é話æ©èœãäžå¿ã«ç޹ä»ããŸããããã¢ãã€ã«ã¢ããªã®QAã«ã¯ãŸã å€ãã®æ¹åäœå°ããããä»åŸã詊è¡é¯èª€ããªããåãçµãã§ããé åããããããããŸãã
é³å£° à ã¢ãã€ã« à èªåå ãšããçµã¿åããã¯æ¢åã®äºäŸãã»ãšãã©ãªãããããŸã§ã«ã é話é²é³ã®å·®åæ€ç¥ã詊äœãã ããã«ãèªåãã¡ã§åµæå·¥å€«ãããªããé²ããŠããŠããšãŠãé¢çœããã£ã¬ã³ãžã ãšæããŠããŸãã
ãããã®é åã«èå³ã®ããæ¹ãããã°ããã²ã«ãžã¥ã¢ã«ã«ã話ãã§ããã°å¬ããã§ãïŒ
-
End-to-Endãã¹ããå®éã®ãŠãŒã¶ãŒæäœã«è¿ãæµããåçŸããŠåäœç¢ºèªãããã¹ã â©ïž
-
Appiumãã¢ãã€ã«ã¢ããªã®UIãã¹ãã«äœ¿ãããèªååãã¬ãŒã ã¯ãŒã¯ â©ïž
-
Maestroãæè¿æ³šç®ãããŠãã軜éã¢ãã€ã«E2EããŒã« â©ïž
-
ããŒã³ãŒãã»ããŒã³ãŒãã®èªåãã¹ããµãŒãã¹ãUIæäœãGUIã§äœæã§ããã OSæšæºUIã«ã¯åŒ±ã â©ïž
-
NetEase補ã®ç»åèªèããŒã¹ã®èªåãã¹ããã¬ãŒã ã¯ãŒã¯ãã²ãŒã é åã§åºã䜿ãããŠãã â©ïž
-
GitHub Actions ã®ã»ã«ããã¹ãã©ã³ããŒãèªåPCã§ Workflow ãå®è¡ã§ããä»çµã¿ â©ïž
-
Model Context ProtocolãLLM ãšå€éšããŒã«ã飿ºãããä»çµã¿ â©ïž
Discussion