èªååã®ããã®ããŒã«ã®éžæ
å§ããããã«ãJava + Selenium + FlexMonkiumãã³ãã«ã«èœã¡çãåã«è¡ã£ãæåããã®ãã¹ãæ€èšããŠãã ããã ãããŠããïŒ
- ã»ã¬ã³+ Sfapi
- ã©ãã¬ãã¯ã¹
- ãã¬ãã¯ã¹ã¢ã³ããŒ
- ã»ã¬ã³+ FlexMonkium
èªååããŒã«ãšããŠæåã«äœ¿çšããããšããã®ã¯ãSfapiïŒSelenium Flex-APIïŒã§ããã Selenium RCããã³ãã©ã€ããŒïŒJavaãCïŒãPythonãRubyïŒãããããã°ã©ãã³ã°èšèªãšé£æºããŠåäœããŸãã å©ç¹ã®ãã¡ãããã¯å®éã«æ©èœããç¡æã®ãœãªã¥ãŒã·ã§ã³ã§ããããšã«æ³šæããŠãã ããã æ¬ ç¹ã®-å€ãã®ã³ãŒãããååãªçµæã§ã¯ãããŸããã ã¢ããªã±ãŒã·ã§ã³ã®åçãªèŠçŽ ã§ã¯ããŸãæ©èœããŸããã ãœãªã¥ãŒã·ã§ã³ãããã«æ€çŽ¢ããçç±ã¯ãåçŽãªæäœãå®è¡ãã倧éã®ã³ãŒãã§ããã
ç§ãè©Šãã次ã®FlexèªååãœãããŠã§ã¢ã¯Ranorex Studioã§ããã ããã¯ãçŽæçãªã€ã³ã¿ãŒãã§ãŒã¹ãåããéåžžã«ãŠãŒã¶ãŒãã¬ã³ããªãŒãªãœãããŠã§ã¢ããã±ãŒãžã§ãã ããã«ãçµã¿èŸŒã¿æ©èœãšSpyãšãŒãžã§ã³ãïŒãŠãŒã¶ãŒã¢ã¯ã·ã§ã³ã®ã·ãŒã±ã³ã¹ãèšé²ããïŒã䜿çšããŠããã°ã©ãã³ã°èšèªãç¥ããã«ãã¹ããè¿ éã«äœæããææ¡ãããããã°ã©ãã³ã°èšèªã®ããããã«å€æããŠäœææžã¿ã®ãã¹ããå®äºããããšã«æ³šæãã䟡å€ããããŸãïŒãµããŒããããŠããèšèªã®ãªã¹ãã¯ãè³Œå ¥ããã©ã€ã»ã³ã¹ã®çš®é¡ã«ãã£ãŠç°ãªããŸãïŒ ïŒããã³ã»ãŒãã¹ãŠã®Flex UIèŠçŽ ãšã®è¯å¥œãªçžäºäœçšïŒãã©ãŒã äžã§ã¯ãDataGridèŠçŽ ã®äžé©åãªäœæ¥ã«é¢ããèŠæ ã«ééããŸããããäœæ¥äžã«äœæ¥ããæ©äŒããããŸããã§ããïŒ ïŒã æ¬ ç¹ã®1ã€ã¯ã©ã€ã»ã³ã¹ã®ã³ã¹ããé«ãããšã§ããç°ãªããã¡ã€ã³ïŒããšãã°ããã¹ããµãŒããŒãšã¡ã€ã³ãµãŒããŒïŒã§ã¢ããªã±ãŒã·ã§ã³ããã¹ãããå¿ èŠãããå Žåã¯ãæåã«ãã¹ãã§ããã€ãã®å€æãè¡ã£ãŠãã¢ããªã±ãŒã·ã§ã³ã€ã³ã¿ãŒãã§ã€ã¹ãšæ£ãã察話ãéå§ããå¿ èŠããããŸãã ãœãªã¥ãŒã·ã§ã³ãããã«æ€çŽ¢ããçç±ãšãªã£ãã®ã¯ãã©ã€ã»ã³ã¹ã®é«ã³ã¹ãã§ããã
Ranorexã©ã€ã»ã³ã¹ã®çµäºãåŸ ããã«ãç§ã¯ããªãŒãœãããŠã§ã¢ã®æ€çŽ¢ãç¶ããFlexMonkeyã®äœ¿çšã«é¢ããã¢ããã€ã¹ã«åºäŒããŸããã 圌ãã®ãŠã§ããµã€ãã«ã¯ãçããç解ããããããã¥ã¡ã³ããããã掻çºãªè°è«ãšã©ã€ããµããŒããè¡ããã©ãŒã©ã ããããŸãã ã¢ããªã±ãŒã·ã§ã³èªäœã¯Adobe Airã§äœæãããŠããããããããã䜿ããããã€ã³ã¿ãŒãã§ã€ã¹ãåããŠããŸãã
çµå±ã®ãšãããFlexMonkeyã¯éåžžã«é«éã§äŸ¿å©ã§ç¡æã§ãã ã»ãŒãã¹ãŠã®UIã³ã³ããŒãã³ãã§ã®åäœãæ£ãããµããŒãããŸãïŒå°ãªããšããã¹ãŠãæåçã§æ©èœããŸããïŒããããã°ã©ãã³ã°èšèªã䜿çšããŠãã¹ããæ¹åã§ããªããšããæ¬ ç¹ããããŸãã å®éãã³ã³ããŒãã³ãã®ããããã£ã®ãã§ãã¯ããããã®ããããã£ã®å€ã®æ¯èŒãªã©ãåºæ¬çãªæ©èœã®ã¿ã䜿çšã§ããŸãã ãã ããããšãã°ãããã°ã©ãã³ã°ããŒã«ãªãã§ã¡ãŒã«ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã«ã¡ãã»ãŒãžãæžã蟌ãããšã¯ã§ããŸããã FlexMonkeyã®äœæè ã«ãã次ã®è£œåã¯ãSeleniumãšé£æºããŠåäœãã FlexMonkiumãšåŒã°ããŸã ã
äœæ¥ç°å¢ã®ã»ããã¢ãã
Flexã¢ããªã±ãŒã·ã§ã³ã®èªååãã¹ããéå§ããã«ã¯ãSelenium RC + FlexMonkiumãšå¯Ÿè©±ããããã«ãããžã§ã¯ããæ§æããããã°ã©ãã³ã°ç°å¢ãæºåããå¿ èŠããããŸãïŒããšãã°ãEclipse IDEã§JavaèšèªãéžæããŸããïŒã ããã«ããã¹ãŠã®ã¢ã¯ã·ã§ã³ã¯ã¹ãããã§èª¬æãããŠããŸãã
1.ãã¹ããäœæããããã°ã©ãã³ã°èšèªïŒç§ã®å Žåã¯JavaïŒçšã®Selenium RCããã³Selenium Client DriverãããŠã³ããŒãããŸãã
2. FlexMonkiumãããŠã³ããŒãããŸã ïŒäŸã§ã¯ããŒãžã§ã³4.1.8ã䜿çšããŸããïŒã ã¢ãŒã«ã€ãã«ã¯3ã€ã®ã³ã³ããŒãã³ããå«ãŸããŸã-.swcã©ã€ãã©ãªãå«ããã©ã«ããŒããã®ãã¡ã®1ã€ã¯Flexãããžã§ã¯ãã«æ¥ç¶ããå¿ èŠããããŸãããuser-extensions.jsãã¯SeleniumãµãŒããŒã®æ¡åŒµã§ããããã¬ãã¯ã¹ã¢ããªã±ãŒã·ã§ã³å¶åŸ¡ã³ãã³ãããç解ãããŸãã Firefoxã®Selenium IDEã®æ©èœãæ¡åŒµãããã¹ãããã³.xpiãã©ã°ã€ã³ã§æå®ãããŠããŸãã
3. Flash Builderã§Flexãããžã§ã¯ããéããããŠã³ããŒãããã¢ãŒã«ã€ãã®.swcã©ã€ãã©ãªããããžã§ã¯ãã«æ¥ç¶ããŸãã ã¢ãŒã«ã€ãã«ã¯ãæåŸã«åãååãšçªå·ã®ãã¡ã€ã«ãããã€ããããŸãã çªå·ã¯Flex-SDKã®ããŒãžã§ã³çªå·ãæå³ããŸãïŒç§ã®å Žåãããã¯4çªç®ã®ããŒãžã§ã³ã§ããã€ãŸããautomation_monkey4.x.swcãæ¥ç¶ããå¿ èŠããããŸãïŒã ãã®åŸããããžã§ã¯ããåã³ã³ãã€ã«ããåºæ¥äžãã-SeleniumãµãŒããŒãšå¯Ÿè©±ããæºåãæŽããŸããã
4.ããã§ãã³ãã³ãæ¡åŒµãã¡ã€ã«ã䜿çšããŠSeleniumãµãŒããŒãèµ·åããå¿ èŠããããŸããããã«ãããFlexã¢ããªã±ãŒã·ã§ã³ã®ç®¡çã«åºæã®ã³ãã³ãããç解ãã§ããããã«ãªããŸãã ãã®ãã¡ã€ã«ã¯ãããŠã³ããŒããããFlexMonkiumã¢ãŒã«ã€ãã«å«ãŸããŠããããuser-extensions.jsããšåŒã°ããŸãã ãµãŒããŒã®èµ·åæã«ã³ãã³ãã©ã€ã³ã§ãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããŸãã ãããã®ç®çã®ããã«ã次ã®å 容ã®å¥åã®batãã¡ã€ã«ãäœæããŸããã
java -jar C:\Automation\selenium-server-standalone-2.0rc2.jar -userExtensions C:\user-extensions.js
ãã®åŸããµãŒããŒãå®å šã«èµ·åã§ããŸãã ãã¹ãŠãæ£ããè¡ãããå Žåãbat'nikãèµ·åããåŸã次ã®ãããªãŠã£ã³ããŠãç»é¢ã«ãã³ã°ã¢ããããŸãã
ãããã£ãŠããã¹ã察象ã®ã¢ããªã±ãŒã·ã§ã³ã¯ãã¹ãèªååããŒã«ãšå¯Ÿè©±ããæºåãã§ããŠãããSelenium-RCãèµ·åããããã¬ãã¯ã¹ã³ã³ããŒãã³ã管çã³ãã³ããç解ããŸãã
æåã®ãã¹ããäœæãã
ãã¹ããäœæããããã®èšèªãšããŠãJUnitã©ã€ãã©ãªãŒãšãšãã«Eclipseéçºç°å¢ã§JavaãéžæããŸããã ãã®çµã¿åããã§ã¯ããã¹ãã¯æ£åžžã«æ©èœããŸããããåãã¹ãã®åŸãJUnitã¯ãã©ãŠã¶ãŒãåèµ·åããŸãããããã¯ãç§ã®ãã¹ãã®å€ãã以åã®ãã¹ãã®ç¶ç¶ã§ãããã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ããªã»ããããã®ãé©åã§ã¯ãªããããç§ã«ã¯ãå§ãã§ããŸããã§ããã ããã€ãã®ãã©ãŒã©ã æ€çŽ¢ã®åŸããã®åäœãç¡å¹ã«ããããšã¯ã§ãããJUnitã®äœ¿çšãæŸæ£ããªããã°ãªããªãã£ãããšãèªã¿ãŸããã ã¬ããŒãã§ã¯ã倱æãããã¹ãããããçºçããã¹ããããããã³çºçãããšã©ãŒã®æ°ã®ã¿ãç¥ãå¿ èŠããããŸããã ãããã®ç®çã®ããã«ããã®æ å ±ãã³ã³ãœãŒã«ã«è¡šç€ºããç¹å¥ãªé¢æ°ãäœæããŸããã ãã¹ãã倱æãããšåŒã³åºããïŒãã¹ãã倱æãããšã¿ã€ã ã¢ãŠããçºçããŸãïŒãJavaã¯äŸå€ãã¹ããŒããŸãã ãã®çµæã次ã®ã³ãŒããåŸãããŸããã
import java.awt.event.KeyEvent; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import com.thoughtworks.selenium.DefaultSelenium; import com.thoughtworks.selenium.HttpCommandProcessor; import com.thoughtworks.selenium.Selenium; public class TestRunner { private Selenium selenium; private HttpCommandProcessor proc; private int errorsFound; // DateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd_HH_ss"); Date date = new Date(); String msg_text = dateFormat.format(date); public static void main(String[] args) { TestRunner tr= new TestRunner(); tr.errorsFound = 0; try{ tr.seleniumStart(); //---- ---- tr.goMail(); tr.postSend(); tr.outBoxVerifyMessage(); }catch(Exception ex) {} } //Starting selenium server public void seleniumStart() throws InterruptedException { proc = new HttpCommandProcessor("localhost", 4444, "*firefox3 c:\\Program Files\\MozillaFirefox3.6\\firefox.exe", "http://q/"); selenium = new DefaultSelenium(proc); selenium.start(); Thread.sleep(5000); selenium.open("/site_media/"); } //Shutting down selenium server public void seleniumStop() { if (selenium != null) { selenium.stop(); selenium = null; } System.out.println("\r\nTesting compleated. Errors found: "+errorsFound); } //Error reporter public void printError(String test, String step) { errorsFound ++; System.out.println("\r\nError in Test: '"+test+"' on step: '"+step+"'"); } //Step runner public void testExec(String testName, String step, String cmd, String locator, int time) throws Exception { for (int t = 0;; t++) { if (t >= time) printError(testName, "Step "+step); try { if (proc.getBoolean(cmd, new String[] {locator})) break; } catch (Exception e) { } Thread.sleep(500); } } //----------------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------------- // public void goMail() throws Exception { String test = "goMail"; //Step 1. testExec(test, "1", "isFlexMonkey", "", 60); //Step 2. "" testExec(test, "2", "isFlexMonkey", "<UIEvent command=\"Select\" value=\"tabBar\"><arg value=\"\"/> </UIEvent>", 60); } //----------------------------------------------------------------------------------- // public void postSend() throws Exception { String test = "postSend"; //Step 3. "" testExec(test, "3", "isFlexMonkey", "<UIEvent command=\"Select\" value=\"buttonBarMail\"><arg value=\"\"/></UIEvent>", 60); //Step 4. testExec(test, "4", "isFlexMonkey", "<UIEvent command=\"Open\" value=\"userDataProvider\"><arg value=\"null\"/></UIEvent>", 60); //Step 5. testExec(test, "5", "isFlexMonkey", "<UIEvent command=\"Select\" value=\"userDataProvider\"><arg value=\" \"/></UIEvent>", 60); //Step 6. "" testExec(test, "6", "isFlexMonkey", "<UIEvent command=\"SelectText\" value=\"subject\"><arg value=\"0\"/><arg value=\"0\"/></UIEvent>", 60); //Step 7. testExec(test, "7", "isFlexMonkey", "<UIEvent command=\"Input\" value=\"subject\"><arg value=\"Hello, "+msg_text+"\"/></UIEvent>", 60); //Step 8. ( ) testExec(test, "8", "isFlexMonkey", "<UIEvent command=\"ChangeFocus\" value=\"subject\"/>", 60); //Step 9. testExec(test, "9", "isFlexMonkey", "<UIEvent command=\"Input\" value=\"message\"><arg value=\"Test of text message " +msg_text+"\"/></UIEvent>", 60); //Step 10. testExec(test, "10", "isFlexMonkey", "<UIEvent command=\"Click\" value=\"\"/>", 60); } //----------------------------------------------------------------------------------------------- // public void outBoxVerifyMessage() throws Exception { String test = "outBoxVerifyMessage"; //Step 1. testExec(test, "1", "isFlexMonkey", "<UIEvent command=\"Select\" value=\"buttonBarMail\"><arg value=\"\"/></UIEvent>", 60); //Step 2. testExec(test, "2", "isFlexMonkey", "<VerifyProperty value=\"subject\" propertyString=\"text\" expectedValue=\"Hello, "+msg_text+"\"/>", 10); //Step 3. testExec(test, "3", "isFlexMonkey", "<VerifyProperty value=\"message\" propertyString=\"text\" expectedValue=\"Test of text message " +msg_text+"\"/>", 10); //Step 4. testExec(test, "4", "isFlexMonkey", "<VerifyProperty value=\"fullName\" propertyString=\"text\" expectedValue=\" \"/>", 10); } }
ãã®äŸã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®å éšã¡ãŒã«ã«ããã¡ãŒã«éä¿¡ããã¹ããããéä¿¡ã¡ãŒã«éã®è¡šç€ºã確èªãããŸãã
ãããŠä»ããã詳现ã«ã seleniumStartããã³seleniumStopé¢æ°ã¯ãã»ãã·ã§ã³ãéå§ããã³çµäºããŸãã æåã®é¢æ°ã¯ãã³ãã³ãããµãŒããŒã«éä¿¡ããSeleniumã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãåæåããŸãã ãã¹ãããã³ããŒãïŒSeleniumãµãŒããŒãå®è¡ãããŠããïŒããã©ãŠã¶ãŒïŒãã¹ããå®è¡ãããïŒãããã³URLïŒãã¹ããããã¢ããªã±ãŒã·ã§ã³ã䜿çšå¯èœïŒãªã©ã®ãã©ã¡ãŒã¿ãŒãããã«è»¢éãããŸãã
次ã¯printErroré¢æ°ã§ããã¹ãåãšã¹ãããçªå·ããã©ã¡ãŒã¿ãŒãšããŠåãåããã³ã³ãœãŒã«ã«è¡šç€ºããŸãã ãã®é¢æ°ã¯ããã¹ãã®ããããã®ã¹ãããã§ã¿ã€ã ã¢ãŠãã«ãªã£ããšãã«åŒã³åºãããŸãã
åã¹ãããã§ç¹°ãè¿ãã³ãŒãã®ãããã¯ãèšè¿°ããªãããã«ããtestExecããšããå¥ã®é¢æ°ã«ç§»åããŸããã ãã®ãã©ã¡ãŒã¿ãŒã¯ãå®è¡ãããã¹ãããã®ååãšçªå·ïŒã¿ã€ã ã¢ãŠãåŸã«ãprintErrorãã«éä¿¡ãããŸãïŒããµãŒããŒã®ã³ãã³ãããå°éãããããšããŠããã¢ããªã±ãŒã·ã§ã³å ã®èŠçŽ ãžã®ãã¹ïŒãã±ãŒã¿ãŒïŒãããã³ã¿ã€ã ã¢ãŠãã§ãã äžèšã®äŸã®ã¢ããªã±ãŒã·ã§ã³ãã¹ã«ã¯ããVerifyPropertyããšãUIEventãã®2ã€ã®ã¿ã€ãããããŸãã åè ã¯ä»»æã®èŠçŽ ã®å±æ§å€ãæ¯èŒããããã«äœ¿çšãããåŸè ã¯æå®ãããèŠçŽ ã«å¯ŸããŠã¢ã¯ã·ã§ã³ãå®è¡ããããã«äœ¿çšãããŸããããšãã°ããã¿ã³ãã¯ãªãã¯ããŸãã ã¢ããªã±ãŒã·ã§ã³ã®UIèŠçŽ ã¯ããã®ååãŸãã¯IDã ãã§ãªãããã®ããããã£ã®ããã€ãã®çµã¿åããã«ãã£ãŠãæå®ã§ããŸãããããã®ããããã£ã¯ããargãã¿ã°ã§ããã«ç€ºãããŸãã ãã詳现ãªããã¥ã¡ã³ãã¯ã Gorilla Logicã® Webãµã€ãã§å ¥æã§ããŸãã
ãã±ãŒã¿ãŒãæåã§èšè¿°ããªãããã«ãFlexMonkeyã䜿çšããŠäžé£ã®æé ãæžãçãããã¹ããxmlãã¡ã€ã«ã«ãšã¯ã¹ããŒãããŠãJavaã³ãŒãã«æ¿å ¥ããŸããã çµæã¯ãã®çµæã§ãïŒ
<FlexMonkey> <TestSuite name="NewTestSuite" description="" ignore="false"> <TestCase name="" description="null" ignore="false"> <Test name=" " description="null" defaultThinkTime="250" ignore="false"> <UIEvent command="Select" value="tabBar" prop="automationName" delay="1000" attempts="10"> <arg value=""/> </UIEvent> <Pause duration="10000"/> <UIEvent command="Select" value="buttonBarMail" prop="automationName" delay="1000" attempts="10"> <arg value=""/> </UIEvent> <Pause duration="1000"/> <UIEvent command="Open" value="userDataProvider" prop="automationName" delay="1000" attempts="10"> <arg value="null"/> </UIEvent> <UIEvent command="Select" value="userDataProvider" prop="automationName" delay="1000" attempts="10"> <arg value=" "/> </UIEvent> ...
ãŸãã¯ãSelenium IDEã«å ããŠflexmonkium.xpiãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããFirefoxãã©ãŠã¶ãŒããçŽæ¥ãã¹ããèšé²ã§ããŸãã
ãã ãããããã®å Žåã§ããç¹ã«ã¢ããªã±ãŒã·ã§ã³ã³ã³ããŒãã³ãã«åçã«çæãããIDãããå Žåãããã2ã€ã®æ¹æ³ã¯100ïŒ æ£ç¢ºãªãã¹ãããã©ãŒãã³ã¹ãä¿èšŒããŸããã ãã®å Žåãå¿ èŠãªã³ã³ããŒãã³ãã«æ確ã«åºæã®åŒæ°ãæåã§è¿œå ããå¿ èŠããããŸãã ã³ã³ããŒãã³ãã®ããããã£ã¯ãFlexMonkeyãŸãã¯FlexMonkiumã³ã³ãœãŒã«ã§è¡šç€ºã§ããŸãã
çµæ
çŸæç¹ã§ã¯ãã»ãšãã©ã®ååž°ãã¹ãã¯ãããžã§ã¯ãã§èªååãããŠããŸãã æ°ã¯350以äžã§ãå®è¡æéã¯çŽ3ã4æéã§ãã
èšäºã®é·ããèšããŸããäŸã§ããã®ãããªå€§ããªã³ãŒãããaã³ããŸãã