
परिचय
हाय हाय! खैर, अंतिम भाग के लिए समय आ गया है, जिसमें मैं लेख के पिछले हिस्सों से रैपर का उपयोग करके लिखे गए सरल परीक्षणों का एक उदाहरण दूंगा। जैसा कि वादा किया गया था, मैं फ्रेमवर्क के एक कार्यशील संस्करण (लिंक देखें) के लिए सार्वजनिक पहुंच को खोलता हूं।
संदर्भ
भाग 1: परिचयभाग 2.1: सेलेनियम एपीआई आवरण - ब्राउज़रभाग 2.2: सेलेनियम एपीआई आवरण - वेबइमेंटभाग 3: वेबपेज - पृष्ठों का वर्णन करनाभाग 4: अंत में परीक्षण लिखनाएक रूपरेखा प्रकाशित करनाचलो चलते हैं
और इसलिए, एक प्रशिक्षण सामग्री के रूप में, हम Google अनुवादक के कई परीक्षण लिखेंगे। मैं किसी भी तरह का टेस्ट कवरेज नहीं कर रहा हूँ, इसलिए मैं 4 परिदृश्यों के साथ आया:
- हैलो रूसी में अनुवाद
- जावास्क्रिप्ट भागने की जाँच
- इनपुट क्षेत्र की सफाई फ़ंक्शन की जाँच करना
- साइट अनुवादक में नेविगेट करने की क्षमता की जाँच करना
मुख्य पृष्ठ काफी सरल है - हमारे पास एक इनपुट फ़ील्ड और एक अनुवाद परिणाम है। अनुवाद करने के लिए, आपको "अनुवाद" बटन पर क्लिक करने की आवश्यकता नहीं है। पृष्ठ विवरण इस तरह निकला:
namespace Autotests.WebPages.Root { public class Index : PageBase { #region Elements private static readonly WebElement SourceEdit = new WebElement().ById("source"); private static readonly WebElement ResutlText = new WebElement().ById("result_box"); private static readonly WebElement ClearButton = new WebElement().ById("clear"); private static readonly WebElement WebsiteTranslatorLink = new WebElement() .ByAttribute(TagAttributes.Href, Pages.Manager.Websites.Index.BaseUrl.ToString(), exactMatch: false); #endregion public void Open(string from, string to) { Contract.Requires(from != to); var url = new Uri(string.Format("{0}#{1}/{2}/", BaseUrl, from, to)); Navigate(url); } public string SourceText { get { return SourceEdit.Text; } } public string ResultText { get { return ResutlText.Text; } } public string Translate(string text) { SourceEdit.Text = text; if (!string.IsNullOrEmpty(text)) { Contract.Assert(WaitHelper.SpinWait(() => !string.IsNullOrEmpty(ResutlText.Text), TimeSpan.FromSeconds(10))); } return ResultText; } public void Clear() { Contract.Assert(ClearButton.Exists(10)); ClearButton.Click(useJQuery: false); } public void OpenWebsiteTranslator() { WebsiteTranslatorLink.Click(useJQuery: false); } } }
मैंने 4 तत्वों का वर्णन किया, उनमें से तीन आईडी द्वारा स्थित हैं, और चौथा - हाइपर विशेषता में लिंक की घटना से। यह पृष्ठ पेजबेस से विरासत में मिला है, जिसका कोड पिछले लेख में दिया गया था और सार्वजनिक रूप से उपलब्ध है। अतिभारित ओपन विधि एक अनुवादक को भाषाओं का संकेत दे सकती है, उदाहरण के लिए एन-आरयू। खैर, वर्ग में वह सभी कार्यक्षमता भी शामिल है जो पहले वर्णित लिपियों के स्वचालन के भाग के रूप में आवश्यक थी।
मैं दूसरे पृष्ठ का विवरण भी दूंगा - साइट अनुवादक:
namespace Autotests.WebPages.Root.Manager.Website { public class Index : PageBase { } }
वर्ग खाली है, क्योंकि परीक्षणों में यह जांचना आवश्यक है कि पृष्ठ खुल गया है, हम उस पर कोई कार्रवाई नहीं करेंगे।
परीक्षण
शुरू करने के लिए, हम आधार वर्ग लिखते हैं:
namespace Autotests.Suites { [TestClass] public abstract class SuiteBase { public TestContext TestContext { get; set; } [TestInitialize] public void TestInitialize() { Browser.Start(); } [TestCleanup] public void TestCleanup() { Browser.Quit(); } } }
वर्ग प्रत्येक परीक्षण के लिए पूर्व शर्त और पोस्टकंडिशन को परिभाषित करता है, इस मामले में, ब्राउज़र को खोलना और बंद करना। मैं ध्यान देता हूं कि उद्घाटन आवश्यक नहीं है, जब आप पहली बार इसे एक्सेस करेंगे तो ब्राउज़र खुल जाएगा TestInitialize और TestCleanup के अलावा, ClassInitialize और ClassCleanup भी हैं, जो पूर्व शर्त और पोस्टकंडिशन भी पूरा करते हैं, लेकिन एक ही कक्षा से परीक्षणों के समूह के लिए जब वे एक साथ (क्रमिक रूप से) चलाए जाते हैं। एक TestContext को यह भी परिभाषित किया गया है कि सभी परीक्षण, उदाहरण के लिए, परिणामों में फ़ाइलों को संलग्न करने के लिए उपयोग कर सकते हैं।
और अंत में, हमारे परीक्षणों के लिए कोड:
namespace Autotests.Suites { [TestClass] public class GoogleTranslateTests : SuiteBase { [TestMethod] public void TranslateText() { #region TestData const string languageFrom = "en"; const string languageTo = "ru"; const string textEn = "hello"; const string textRu = ""; #endregion Pages.Index.Open(languageFrom, languageTo); var result = Pages.Index.Translate(textEn); Assert.AreEqual(textRu, result, string.Format("{0} != {1}.", textRu, result)); } [TestMethod] public void CheckJavaScriptEscape() { #region TestData const string languageFrom = "en"; const string languageTo = "en"; const string javascript = "alert(1);"; #endregion Pages.Index.Open(languageFrom, languageTo); var result = Pages.Index.Translate(javascript); Assert.AreEqual(javascript, result, "JavaScript was executed."); } [TestMethod] public void ClearSourceText() { Pages.Index.Open(); Pages.Index.Translate(RandomHelper.RandomString); Pages.Index.Clear(); Assert.IsTrue(string.IsNullOrEmpty(Pages.Index.SourceText), "Source text was not cleared."); } [TestMethod] public void NavigateWebsiteTranslator() { Pages.Index.Open(); Pages.Index.OpenWebsiteTranslator(); Assert.IsTrue(Browser.Url.Contains(Pages.Manager.Websites.Index.BaseUrl), "WebsiteTranslator was not opened."); } } }
मैं ध्यान देता हूं कि एक परीक्षण एक तार्किक कार्रवाई की पुष्टि करता है। परीक्षण डेटा परीक्षण में है, लेकिन आप इसे कहीं भी स्टोर कर सकते हैं - एक्सएमएल में, डेटाबेस में और किसी अन्य रिपॉजिटरी में। मैं डीडीटी को एक लिंक भी दूंगा
: डेटा-संचालित इकाई परीक्षण कैसे बनाएंनिष्कर्ष
लेख पढ़ने वाले सभी से धन्यवाद, सवाल पूछे और सुझाव दिए! यह मेरी कहानी का अंत है, और मैं खुद बहुत खुश हूं कि मैं नौकरी खत्म करने में कामयाब रहा और RuNet में सेलेनियम C # पर वेब एप्लिकेशन के स्वचालित परीक्षण के बारे में बात की, क्योंकि रूसी में बहुत कम जानकारी और उदाहरण हैं। सौभाग्य है