2011-01-27 16 views
9

मैं प्रत्येक ब्राउज़र के लिए पूरे सूट को डुप्लिकेट किए बिना एक एनयूनीट परीक्षण सूट का पुन: उपयोग करने का एक तरीका ढूंढ रहा हूं। ऐसा लगता है कि मुझे प्रत्येक ब्राउज़र के लिए एक नया मुकाबला चाहिए। क्या मैं ब्राउज़र को स्विच करने के लिए NUnit gui से कुछ प्रकार के पर्यावरण चर या कॉन्फ़िगरेशन सेटिंग भेज सकता हूं? नीचे देखें:मैं सेलेनियम और एक सिंगल एन सूट सूट के साथ कई ब्राउज़रों का परीक्षण कैसे करूं और इसे DRY रखूं?

[TestFixture] 
public class User 
{ 
    private ISelenium selenium; 
    private StringBuilder verificationErrors; 

    [SetUp] 
    public void SetupTest() 
    { 
     // TheBrowser = How do I populate this variable from the NUnit gui? 
     selenium = new DefaultSelenium("localhost", 4444, **TheBrowser**, "http://localhost:52251/"); 
     selenium.Start(); 
     verificationErrors = new StringBuilder(); 
    } 

    [TearDown] 
    public void TeardownTest() 
    { 
     ... 
    } 

    [Test] 
    public void SearchUser() 
    { 
     ... 
    } 

} 

उत्तर

4

अच्छा सवाल, बहुत से लोग इस मुद्दे में भाग लेते हैं। मैं एक आईओसी कंटेनर का उपयोग कर अपने परीक्षण मामले में अपने ब्राउज़र इंजेक्शन का प्रशंसक हूं। यही कारण है कि मुझे एक इंजेक्शन 'mudule'

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

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

मुझे यकीन है कि आप अपने लिए Google से बेहतर कर सकते हैं, लेकिन ये कुछ डीआई और न्यूटिट लिंक हैं जिन्हें मैंने सोचा था।

NUnit integration tests and dependency injection

http://buildstarted.com/2010/08/24/dependency-injection-with-ninject-moq-and-unit-testing/

आप डि पसंद नहीं है मैं कारखाने तरीकों का उपयोग कर कुछ बाहरी सेटअप के आधार पर अपने ब्राउज़र उत्पन्न करने के लिए लोगों के बारे में सुना है।

5

NUnit 2.5+ जेनेरिक टेस्ट फिक्स्चर का समर्थन करता है जो एकाधिक ब्राउज़रों में परीक्षण को बहुत सरल बनाता है। http://www.nunit.org/index.php?p=testFixture&r=2.5

निम्नलिखित बिल्डिंग दो "GoogleTest" NUnit परीक्षण, फ़ायरफ़ॉक्स के लिए एक और आईई के लिए एक बना देगा।

using NUnit.Framework; 
using OpenQA.Selenium; 
using OpenQA.Selenium.Firefox; 
using OpenQA.Selenium.IE; 
using System.Threading; 

namespace SeleniumTests 
{ 
    [TestFixture(typeof(FirefoxDriver))] 
    [TestFixture(typeof(InternetExplorerDriver))] 
    public class TestWithMultipleBrowsers<TWebDriver> where TWebDriver : IWebDriver, new() 
    { 
     private IWebDriver driver; 

     [SetUp] 
     public void CreateDriver() { 
      this.driver = new TWebDriver(); 
     } 

     [Test] 
     public void GoogleTest() { 
      driver.Navigate().GoToUrl("http://www.google.com/"); 
      IWebElement query = driver.FindElement(By.Name("q")); 
      query.SendKeys("Bread" + Keys.Enter); 

      Thread.Sleep(2000); 

      Assert.AreEqual("bread - Google Search", driver.Title); 
      driver.Quit(); 
     } 
    } 
} 
2

यहाँ परीक्षण

using OpenQA.Selenium; 
using SeleniumPageObjectsPatternExample.Attributes; 
using SeleniumPageObjectsPatternExample.PageObjects; 
using Xunit; 
using Xunit.Extensions; 

public class HomepageTests 
{ 
    [Theory] 
    [Browser(Type.Firefox)] 
    [Browser(Type.GoogleChrome)] 
    public void HomepageLinksToBlogPage(IWebDriver webDriver) 
    { 
     // arrange 
     var expected = "some expected value"; 

     // act 
     var homepage = new HomePage(webDriver, true); 

     // assert 
     Assert.True(homepage.BlogLink.Displayed); 
     Assert.Equal(expected, homepage.Header.Text); 
    } 
} 

यहाँ करने के लिए ड्राइवर उपलब्ध कराने के लिए एक कस्टम XUnit DataAttribute का उपयोग कर एक उदाहरण इकाई परीक्षण है कस्टम DataAttribute

using System.Reflection; 
using OpenQA.Selenium; 
using SeleniumPageObjectsPatternExample.WebDriver; 
using Xunit.Extensions; 

public class BrowserAttribute : DataAttribute 
{ 
    private IWebDriver WebDriver { get; set; } 

    public BrowserAttribute(Type browser) 
    { 
     this.WebDriver = WebDriverFactory.Create(browser); 
    } 

    public override IEnumerable<object[]> GetData(MethodInfo methodUnderTest, System.Type[] parameterTypes) 
    { 
     return new[] { new[] { this.WebDriver } }; 
    } 
} 

इस WebDriverFactory

का उपयोग करना है
using OpenQA.Selenium; 
using OpenQA.Selenium.Chrome; 
using OpenQA.Selenium.Firefox; 

using Type = SeleniumPageObjectsPatternExample.Attributes.Type; 

public class WebDriverFactory 
{ 
    public static IWebDriver Create(Type browser) 
    { 
     IWebDriver webDriver; 

     switch (browser) 
     { 
      case Type.Firefox: 
       webDriver = new FirefoxDriver(); 
       break; 
      case Type.GoogleChrome: 
       webDriver = new ChromeDriver(); 
       break; 
      default: 
       webDriver = new ChromeDriver(); 
       break; 
     } 

     webDriver.Manage().Window.Maximize(); 

     return webDriver; 
    } 
} 

और ब्राउज़र का प्रकार enum

public enum Type 
{ 
    Firefox, 
    GoogleChrome 
} 

मैं तुम्हें कुछ और करने के लिए प्रकार से enum का नाम बदलने की सलाह देंगे ...

1

मैं लूसिफ़ेर के समाधान के लिए एक महत्वपूर्ण बदलाव के सुझाव देते हैं। विशेषता फैक्ट/थ्योरी विधियों के लिए एक कारखाने नहीं, एक कारखाने की आपूर्ति है। क्यूं कर? खैर, जब आप उन सभी ब्राउज़र विंडो पॉप-अप (n x m, जहां n = परीक्षणों की संख्या, एम = ब्राउज़र प्रति परीक्षण), आप तय करेंगे कि परीक्षा केवल वास्तव में चल रही है जब परीक्षण चलाने के लिए।

तो कुछ नाम परिवर्तन तथा इसके पहले के समाधान, से अद्यतन के साथ ...

using OpenQA.Selenium; 
using SeleniumPageObjectsPatternExample.Attributes; 
using SeleniumPageObjectsPatternExample.PageObjects; 
using Xunit; 
using Xunit.Extensions; 

namespace SeleniumHelpers 
{  
    public class HomepageTests 
    { 
     [Theory] 
     [WebDriver(DriverType.Firefox)] 
     [WebDriver(DriverType.GoogleChrome)] 
     public void HomepageLinksToBlogPage(WebDriverFactory factory) 
     { 
      // arrange 
      IWebDriver webDriver = factory.Create(); // Browser starts here. 
      var expected = "some expected value"; 

      // act 
      var homepage = new HomePage(webDriver, true); 

      // assert 
      Assert.True(homepage.BlogLink.Displayed); 
      Assert.Equal(expected, homepage.Header.Text); 

      // Optional cleanup (better wrapped in try/finally for entire method). 
      webDriver.Quit(); 
      webDriver.Dispose(); 
     } 
    } 
} 

अपडेट किया गया DataAttribute ... (ध्यान दें, मैं विधि GetData() के हस्ताक्षर नवीनतम XUnit के साथ काम करने के लिए सही।)

using System.Reflection; 
using OpenQA.Selenium; 
using Xunit.Extensions; 

namespace SeleniumHelpers 
{  
    public class WebDriverAttribute : DataAttribute 
    { 
     private WebDriverFactory WebDriverFactory { get; set; } 

     public WebDriverAttribute(Type browser) 
     { 
      this.WebDriver = WebDriverFactory.Create(browser); 
     } 

     public override IEnumerable<object[]> GetData(MethodInfo methodUnderTest) 
     { 
      return new[] { new[] { this.WebDriverFactory } }; 
     } 
    } 
} 

नई WebDriverFactory

using OpenQA.Selenium; 
using OpenQA.Selenium.Chrome; 
using OpenQA.Selenium.Firefox; 

namespace SeleniumHelpers 
{  
    public enum DriverType 
    { 
     Firefox, 
     GoogleChrome 
    } 

    public class WebDriverFactory 
    { 
     private DriverType _driverType; 
     public WebDriverFactory(DriverType driverType) 
     { 
      _driverType = driverType; 
     } 

     public static IWebDriver Create(Type browser) 
     { 
      IWebDriver webDriver; 

      switch (browser) 
      { 
       case Type.Firefox: 
        webDriver = new FirefoxDriver(); 
        break; 
       case Type.GoogleChrome: 
        webDriver = new ChromeDriver(); 
        break; 
       default: 
        webDriver = new ChromeDriver(); 
        break; 
      } 

      webDriver.Manage().Window.Maximize(); 

      return webDriver; 
     } 
    } 
} 
संबंधित मुद्दे