सेलेनियम परीक्षणों के लिए एक बुनियादी परीक्षण वर्ग कैसे बनाया जाए और JUnit RuleChain के माध्यम से प्रारंभ करें

इस लेख के साथ, हम एक बड़ी सूचना प्रणाली (बाद में सिस्टम के रूप में संदर्भित) में से एक में LANIT परियोजनाओं की एक बड़ी सूचना प्रणाली (बाद में ऑटो-परीक्षण के रूप में संदर्भित) की प्रक्रिया को कैसे स्वचालित करते हैं, इस पर प्रकाशन जारी रखते हैं।

एक वर्ग पदानुक्रम को कुशलता से कैसे व्यवस्थित करें? प्रोजेक्ट ट्री पर पैकेज कैसे वितरित करें? यह सुनिश्चित करने के लिए कि आप 10 लोगों की टीम के साथ मर्ज संघर्ष के बारे में भूल गए हैं? ये मुद्दे हमेशा एक नए विकास की शुरुआत में होते हैं और उनके पास कभी पर्याप्त समय नहीं होता है।

स्रोत

इस लेख में, हम कक्षाओं की संरचना और कोड के संगठन का वर्णन करते हैं, जिसने हमें संघीय महत्व की एक बड़ी प्रणाली के लिए जूनिट और सेलेनियम पर आधारित डेढ़ हजार एंड-टू-एंड यूआई परीक्षणों से कम प्रयास के साथ विकसित करने की अनुमति दी। इसके अलावा, हम सफलतापूर्वक इसका समर्थन करते हैं और मौजूदा परिदृश्यों को लगातार परिष्कृत करते हैं।

यहां आप ऑटोटेस्ट्स के आधार वर्गों के पदानुक्रम संरचना, कार्यात्मक मॉडल जावा-पैकेज के अनुसार परियोजना के टूटने, और वास्तविक कक्षाओं के नमूना टेम्पलेट्स का व्यावहारिक विवरण पा सकते हैं।

यह लेख उन सभी डेवलपर्स के लिए उपयोगी होगा जो सेलेनियम पर आधारित स्व-परीक्षण विकसित करते हैं।

यह लेख एक सामान्य प्रकाशन का हिस्सा है जिसमें हमने बताया कि कैसे एक छोटी सी टीम ने यूआई परीक्षण स्वचालन प्रक्रिया का निर्माण किया और इसके लिए जूनिट और सेलेनियम पर आधारित एक रूपरेखा विकसित की।

पिछले भाग:


सभी परीक्षणों और JUnit RuleChain के लिए बेस क्लास कार्यान्वयन


ऑटोटेस्ट्स को विकसित करने की अवधारणा, जैसा कि पिछले लेख ( भाग 2. तकनीकी। वास्तुकला और तकनीकी स्टैक। कार्यान्वयन विवरण और तकनीकी आश्चर्य ) में दिखाया गया है, एक रूपरेखा के विचार पर आधारित है जिसमें सभी ऑटोटेस्ट के लिए सिस्टम फ़ंक्शन का एक सेट प्रदान किया जाता है - वे मूल रूप से एकीकृत होते हैं और डेवलपर्स को सक्षम करते हैं। ऑटोटेस्ट्स परीक्षण कक्षाओं के व्यवसाय कार्यान्वयन के विशिष्ट मुद्दों पर ध्यान केंद्रित करते हैं।

ढांचे में निम्नलिखित कार्यात्मक ब्लॉक शामिल हैं:

  • नियम - WebDriver के प्रारंभ और एक वीडियो परीक्षण प्राप्त करने के रूप में परीक्षण बुनियादी ढांचे के घटकों को प्रारंभिक और अंतिम रूप देना। नीचे और अधिक विवरण में वर्णित है;
  • WebDriverHandlers - जावा स्क्रिप्ट निष्पादित करने या ब्राउज़र लॉग एक्सेस करने जैसे वेब ड्राइवर के साथ काम करने के लिए सहायक कार्य करता है। स्थिर राज्य-कम विधियों के एक सेट के रूप में लागू किया गया;
  • WebElements ठेठ वेब तत्वों या उनके समूहों का एक पुस्तकालय है, जिसमें आवश्यक क्रॉस-फ़ंक्शन कार्यक्षमता और विशिष्ट व्यवहार शामिल हैं। हमारे मामले में, इस कार्यक्षमता में वेब ब्राउज़र की तरफ अतुल्यकालिक संचालन के पूरा होने की संभावित जांच शामिल है। सेलेनियम और सेलेनाइड पुस्तकालयों से वेब तत्वों के विस्तार के रूप में लागू किया गया।

परीक्षण वातावरण का प्रारंभ। नियम


सभी परीक्षण कक्षाओं के लिए मुख्य वर्ग बेसटेस्ट है, जहां से सभी परीक्षण कक्षाएं विरासत में मिली हैं। बेसटेस्ट क्लास परीक्षणों के जूनिट "रनर" और रूलेचिन को परिभाषित करता है, जैसा कि नीचे दिखाया गया है। नियम वर्गों द्वारा प्रदान किए गए कार्यों के लिए लागू परीक्षण कक्षाओं से प्रवेश नियम कक्षाओं के स्थिर तरीकों के माध्यम से प्रदान किया जाता है।

बेसटेस्ट नमूना कोड अगले बॉक्स में प्रस्तुत किया गया है।

@RunWith(FilterTestRunner.class) public class BaseTest { private TemporaryFolder downloadDirRule                                                                  = new TemporaryFolder(getSomething().getWorkingDir());      @Rule     public RuleChain rules = RuleChain             .outerRule(new Timeout(TimeoutEnum.GLOBAL_TEST_TIMEOUT.value(),                                                                       TimeUnit.SECONDS))             .around(new TestLogger())             .around(new StandStateChecker())             .around(new WaitForAngularCreator())             .around(downloadDirRule)             .around(new DownloaderCreator(downloadDirRule))             .around(new EnvironmentSaver())             .around(new SessionVideoHandler())             .around(new DriverCreator(downloadDirRule))             .around(new BrowserLogCatcher(downloadDirRule))             .around(new ScreenShooter())             .around(new AttachmentFileSaver())             .around(new FailClassifier())             .around(new PendingRequestsCatcher());     //            final protected SomeObject getSomething() {         return Something.getData();    }    … } 

FilterTestRunner.class - BlockJUnit4ClassRunner का विस्तार, विशेष फ़िल्टर एनोटेशन (मान = "some_stat_and_tag") के मूल्य द्वारा नियमित अभिव्यक्तियों के आधार पर निष्पादन योग्य परीक्षणों की संरचना को फ़िल्टर करता है। कार्यान्वयन नीचे दिया गया है।

org.junit.rules.Timeout - परीक्षणों की अधिकतम निरंतरता को सीमित करने के लिए उपयोग किया जाता है। इसे पहले स्थापित किया जाना चाहिए, क्योंकि यह एक नई शाखा में परीक्षण शुरू करता है।

TestLogger एक ऐसा वर्ग है जो परीक्षण को ELK विश्लेषिकी में उपयोग के लिए json प्रारूप में घटनाओं को लॉग करने की अनुमति देता है। Org.junit.runner.Description से परीक्षण डेटा के साथ घटनाओं को समृद्ध करता है। यह अतिरिक्त रूप से स्वचालित रूप से ईएलके के लिए ईवेंट्स को अपने प्रारूप और परिणाम के साथ परीक्षण को शुरू-समाप्त करने के लिए बनाता है

StandStateChecker एक ऐसा वर्ग है जो वेब चालक को आरम्भ करने से पहले लक्ष्य के वेब इंटरफेस की उपलब्धता की जाँच करता है। एक त्वरित जांच प्रदान करता है कि सिद्धांत में स्टैंड उपलब्ध है।

WaitForAngularCreator - एक वर्ग जो अतुल्यकालिक कोणीय संचालन को पूरा करने के लिए वेब ड्राइवर हैंडलर को इनिशियलाइज़ करता है। इसका उपयोग लंबी समकालिक कॉल के साथ "विशेष" परीक्षणों को अनुकूलित करने के लिए किया जाता है।

org.junit.rules.TemporaryFolder - वेब ब्राउज़र के माध्यम से फ़ाइल अपलोड और डाउनलोड संचालन के लिए फ़ाइलों को संग्रहीत करने के लिए एक अद्वितीय अस्थायी फ़ोल्डर सेट करने के लिए उपयोग किया जाता है।

DownloaderCreator एक वर्ग है जो ब्राउज़र द्वारा डाउनलोड की गई फ़ाइलों की एक अस्थायी निर्देशिका में अपलोड संचालन के लिए समर्थन प्रदान करता है और सेलेन वीडियो फ़ंक्शन के माध्यम से रिकॉर्ड किया जाता है।

एन्वायर्नमेंसेवर - एक वर्ग जो परीक्षण रिपोर्ट के बारे में सामान्य जानकारी को एल्योर रिपोर्ट में जोड़ता है।  

SessionVideoHandler - एक वर्ग जो वीडियो परीक्षण फ़ाइल अपलोड करता है, यदि कोई हो, और रिपोर्ट में Allure लागू होता है।

DriverCreator एक ऐसा वर्ग है जो सेट पैरामीटर के आधार पर WebDriver (परीक्षणों के लिए सबसे महत्वपूर्ण वर्ग) को इनिशियलाइज़ करता है - लोकल, सोलनॉइड या ग्रैग-सेलेनॉइड। इसके अतिरिक्त, वर्ग हमारे परीक्षण के लिए आवश्यक जावा स्क्रिप्ट के सेट को निष्पादित करता है। वेब चालक तक पहुँचने वाले सभी नियमों को इस वर्ग के बाद शुरू किया जाना चाहिए।

BrowserLogCatcher - एक वर्ग जो ब्राउज़र लॉग से गंभीर संदेशों को पढ़ता है, उन्हें ELK (TestLogger) में लॉग करता है और इसे एल्योर रिपोर्ट पर लागू करता है।

स्क्रीनशूटर - एक ऐसा वर्ग जो असफल परीक्षणों के लिए ब्राउज़र स्क्रीन का स्क्रीनशॉट लेता है और इसे WebDriverRunner.getWebDriver () के रूप में रिपोर्ट पर लागू करता है। GetScreenshotAs (OutputType.BYTES)

AttachmentFileSaver - एक वर्ग जो आपको Allure को संलग्न करने की अनुमति देता है, वह परीक्षणों के व्यावसायिक तर्क द्वारा आवश्यक मनमानी फ़ाइलों का एक सेट देता है। सिस्टम में अपलोड या डाउनलोड की गई फ़ाइलों को संलग्न करने के लिए उपयोग किया जाता है।

FailClassifier एक विशेष वर्ग है जो एक परीक्षण दुर्घटना की स्थिति में, यह निर्धारित करने की कोशिश करता है कि क्या यह दुर्घटना बुनियादी ढांचे की समस्याओं के कारण हुई थी। "सिस्टम त्रुटि No.XXXXXXXXXX" प्रकार की विशेष मोडल खिड़कियों के स्क्रीन (एक दुर्घटना के बाद) पर उपस्थिति के लिए जाँच करता है, साथ ही साथ टाइप 404 और जैसे सिस्टम संदेश। आपको गिरी हुई परीक्षाओं को व्यवसायिक दुर्घटनाओं (परिदृश्य के अनुसार) या सिस्टम की समस्याओं में विभाजित करने की अनुमति देता है। एक्सटेंशन के माध्यम से काम करता है। org.junit.rules.TestWatcher। # असफल विधि।

PendingRequestsCatcher एक अन्य विशेष वर्ग है जो आगे वर्गीकृत करने का प्रयास करता है कि दुर्घटना कोणीय और वेब दृश्यपटल के बीच अपूर्ण, जमे हुए या बहुत लंबे आराम सेवाओं के कारण हुई। कार्यात्मक परीक्षण के अलावा, यह भारी भार के तहत समस्याग्रस्त और बर्फ़ीली बाकी सेवाओं की पहचान करना संभव बनाता है, साथ ही साथ रिलीज की समग्र स्थिरता भी। ऐसा करने के लिए, क्लास ईएलके में सभी घटनाओं को जमे हुए बाकी अनुरोधों के साथ लॉग करता है जो इसे एक खुले वेब ड्राइवर के माध्यम से ब्राउज़र में विशेष जेएस लॉन्च करके प्राप्त होता है।

टेस्ट क्लास इंप्लीमेंटेशन टेम्प्लेट


 package autotest.test.<sub-system>; @Feature("     TMS") @Story("    TMS") @Owner("       ") @TmsLink("    .   ") public class <   >_Test extends BaseTest { /** *           **/    Login orgTest; /**         **/    Login loginStep1;    ...    Login loginStepN;    /** *   -      -   * ...         **/      /** *    *              *    Utils.allure.message("     -", business_object) *     null,             . *             preconditions  actions    *  Utils.allure.message("      ", documentNumber) **/ @Step("  ") private void init(Login login) {    some_business_object = //         login        Utils.allure.message("     -", some_business_object)                           // ...             /**     */        loginStep1 = LoginFactory.get(_Some_Login_);    ...    loginStepN = LoginFactory.get(_Some_Login_); }    /** *       **/    @Test    @Filter("       JUnit")    @DisplayName("    TMS")    public void <   >_<>_<__>_Test() {  //            orgTest = LoginFactory.get(_Some_Login_);                //               init(orgTest);           //    -.                preconditions();               //             actions(orgTest); }    /** *        **/ @Step(" ") protected void preconditions() {    loginStep1.login();    new SomeAction().apply(someTestObject1, ..., someTestObjectN);        Utils.allure.message("   -      -", someTestObjectN)        ...    }    /** *        */ @Step(" ") protected void actions(Login testLogin) {    testLogin.reLogin();               //                new SomeAction().apply(someTestObject1, ..., someTestObjectN); } } 

टेस्ट स्क्रिप्ट क्लास इंप्लीमेंटेशन टेम्प्लेट


 package autotest.business.actions.some_subsystem; public class SomeAction {            //   PageClassA pageA = new PageClassA(); PageClassB pageB = new PageClassB();    @Step("     TMS")    @Description("     TMS")    public void apply(someTestObject1, ..., someTestObjectN) {    //   TMS        step_1(...);        step_2(...);        ...        step_N(...);    }    @Step("  1    TMS")    private void step_1(...) {       pageA.createSomething(someTestObject1);// just as an example create }    @Step("  2    TMS")    private void step_2(...) {   pageA.checkSomething(someTestObject1);// just as an example }                       ... } 

FilterTestRunner Test Filtering Class को कार्यान्वित करना


यहाँ मनमाने टैग सेट के आधार पर फ़िल्टरिंग टेस्ट के लिए BlockJUnit4ClassRunner एक्सटेंशन का कार्यान्वयन है।

 /** * Custom runner for JUnit4 tests. * Provide capability to do additional filtering executed test methods * accordingly information that could be provided by {@link FrameworkMethod} */ public class FilterTestRunner extends BlockJUnit4ClassRunner { private static final Logger LOGGER = Logger.getLogger(FilterTestRunner.class.getName()); public FilterTestRunner(Class<?> klass) throws InitializationError {    super(klass); } /** * This method should be used if you want to hide filtered tests completely from output **/ @Override protected List<FrameworkMethod> getChildren() {    //  ,        @Filter       TestFilter filter = TestFilterFactory.get();    List<FrameworkMethod> allMethods = super.getChildren();    List<FrameworkMethod> filteredMethod = new ArrayList<>();    for (FrameworkMethod method: allMethods) {        if (filter.test(method)) {            LOGGER.config("method [" + method.getName() +"] passed by filter [" + filter.toString() + "]" );            filteredMethod.add(method);        } else {            LOGGER.config("method [" + method.getName() +"] blocked by filter [" + filter.toString() + "]" );        }    }    return Collections.unmodifiableList(filteredMethod); } /** * This method should be used if you want to skip filtered tests but no hide them @Override protected boolean isIgnored(FrameworkMethod method) {    …    if (filter.test(method)) {        return super.isIgnored(method);    } else {     return true;  }} */ } 

अगले भाग में, मैं इस बारे में बात करूँगा कि हमने कंटेनर से फाइल को अपलोड करने की प्रक्रिया को ब्राउज़र के साथ परीक्षण ढांचे में कैसे लागू किया, और ब्राउज़र द्वारा डाउनलोड की गई फ़ाइल का नाम खोजने की समस्या को हल किया।

वैसे, हमें अपनी टीम की भरपाई करने में खुशी होगी। वर्तमान रिक्तियों यहाँ हैं

Source: https://habr.com/ru/post/hi480910/


All Articles