2009-03-24 11 views
8

विजुअल स्टूडियो 2008 में एक बहुत ही सरल WatiN 2.0 (CTP3) परीक्षण चलाने की कोशिश करते समय मुझे पता चला कि पहला हमेशा ठीक निष्पादित करता है।विजुअल स्टूडियो 2008 में WatiN - दूसरी टेस्ट विधि

टेस्ट विधि testProject.WatinTest.testTwo फेंक दिया अपवाद: System.Runtime.InteropServices.InvalidComObjectException: कॉम उद्देश्य यह है कि कर दिया गया है दूसरे टेस्ट विधि निम्न अपवाद उत्पादन आईई वस्तु में कुछ तोड़ने के लिए लग रहे हैं उसके अंतर्निहित RCW से अलग जा नहीं इस्तेमाल किया जा सकता ..

एक नमूना कोड के नीचे है। जिस तरह से प्रारंभिक विधि VS2008 में कार्यरत है, ब्राउज़र चर को static के रूप में परिभाषित किया जाना चाहिए, जो मुझे विश्वास है कि समस्या की कुंजी हो सकती है। दुर्भाग्यवश जब तक कि सामान्य विधि में ब्राउज़र खोला नहीं जाता है, इसका मतलब है कि प्रत्येक परीक्षा के लिए एक अलग विंडो नहीं है जो आदर्श नहीं है

मैं इसे ठीक करने के तरीके पर किसी भी विचार के लिए बहुत आभारी हूं। Google खोज और SO खोज ने कोई उपयोगी परिणाम नहीं दिया है, इसलिए मुझे उम्मीद है कि इस प्रश्न का एक अच्छा जवाब समुदाय की मदद करेगा। बहुत धन्यवाद,


private static IE ie 

    [ClassInitialize] 
    public static void testInit(TestContext testContext) 
    { 
     ie = new IE("http://news.bbc.co.uk"); 
    } 

    [TestMethod] 
    public void testOne() 
    { 
     Assert.IsTrue(ie.ContainsText("Low graphics")); 
    } 

    [TestMethod] 
    public void testTwo() 
    { 
     Assert.IsTrue(ie.ContainsText("Low graphics")); 
    } 

उत्तर

10

मैंने इस समस्या को पहले सुना है और थोड़ी देर के लिए इसकी जांच करने के लिए किया है। अब WATN 2.0 बीटा 1 उपलब्ध है, मैं बैठ गया और विजुअल स्टूडियोज टेस्ट रनर के साथ इस समस्या को हल करने के लिए एक सहायक वर्ग बनाया। सहायक वर्ग और संशोधित परीक्षण वर्ग के बाद। मैं इस समाधान के बारे में blogged भी इसे और अधिक जोखिम देने के लिए।

public class IEStaticInstanceHelper 
{ 
    private IE _ie; 
    private int _ieThread; 
    private string _ieHwnd; 

    public IE IE 
    { 
     get 
     { 
      var currentThreadId = GetCurrentThreadId(); 
      if (currentThreadId != _ieThread) 
      { 
       _ie = IE.AttachToIE(Find.By("hwnd", _ieHwnd)); 
       _ieThread = currentThreadId; 
      } 
      return _ie; 
     } 
     set 
     { 
      _ie = value; 
      _ieHwnd = _ie.hWnd.ToString(); 
      _ieThread = GetCurrentThreadId(); 
     } 
    } 

    private int GetCurrentThreadId() 
    { 
     return Thread.CurrentThread.GetHashCode(); 
    } 
} 

और परीक्षण वर्ग इस सहायक का उपयोग कर:

[TestClass] 
public class UnitTest 
{ 
    private static IEStaticInstanceHelper ieStaticInstanceHelper; 

    [ClassInitialize] 
    public static void testInit(TestContext testContext) 
    { 
     ieStaticInstanceHelper = new IEStaticInstanceHelper(); 
     ieStaticInstanceHelper.IE = new IE("http://news.bbc.co.uk"); 
    } 

    public IE IE 
    { 
     get { return ieStaticInstanceHelper.IE; } 
     set { ieStaticInstanceHelper.IE = value; } 
    } 

    [ClassCleanup] 
    public static void MyClassCleanup() 
    { 
     ieStaticInstanceHelper.IE.Close(); 
     ieStaticInstanceHelper = null; 
    } 

    [TestMethod] 
    public void testOne() 
    { 
     Assert.IsTrue(IE.ContainsText("Low graphics")); 
    } 

    [TestMethod] 
    public void testTwo() 
    { 
     Assert.IsTrue(IE.ContainsText("Low graphics")); 
    } 
} 

HTH, जेरोन

+0

शानदार, जेरोनी। यह एक अच्छा जवाब है और मुझे उम्मीद है कि इससे बहुत से लोगों की मदद मिलेगी जिनके पास एक ही समस्या है। साथ ही मुझे उम्मीद है कि अब आपके ब्लॉग और एसओ Google के बीच सार्थक सुझाव देने में सक्षम होंगे जब लोग –

+0

समाधान की खोज करेंगे, मुझे वैटिन के नवीनतम संस्करण के लिए नेलुज के कोड (आपके कोड के आधार पर) का उपयोग करना था। हालांकि, मुझे क्लासक्लेनअप पर अपवाद मिल रहे थे और प्रक्रिया के साथ प्रक्रिया को मारने के बिना ब्राउज़र को निपटाने में असमर्थ थे। किल() ... जो एक बदसूरत समाधान है :( –

0

मुझे लगता है कि जिस तरह से आप आईई चर करने के लिए एक पकड़ रख रहे हैं से संबंधित है। मैं नमूना में कोई परेशानी नहीं के साथ इसका उपयोग कर रहा हूं: http://watin.sourceforge.net/। मैं यूनिट परीक्षणों की तुलना में अधिक कार्यात्मक/एकीकरण परीक्षण के रूप में वॉटर परीक्षण देखता हूं, इसलिए प्रत्येक परीक्षण विभिन्न इंटरैक्शन के साथ एक कहानी की तरह है। मैं कोड संरचना की सहायता के लिए पेज ऑब्जेक्ट पैटर्न का उपयोग करता हूं - http://code.google.com/p/webdriver/wiki/PageObjects देखें।

Ps। मैंने उदाहरण का पुन: उपयोग करने पर विचार किया है लेकिन वास्तव में इसे आजमाया नहीं है। ब्राउज़र के खोलने/बंद करने के उदाहरण परीक्षण में समय जोड़ते हैं।

+0

धन्यवाद मदद करता है। WatiN पृष्ठ पर उदाहरण मेरे लिए ठीक काम कर रहे हैं लेकिन वास्तविक जीवन परिदृश्यों के लिए मुझे कुछ और चाहिए। हम पृष्ठ ऑब्जेक्ट पैटर्न का उपयोग कर सकते हैं लेकिन इसे यहां डालने से नमूना कोड अपठनीय हो जाएगा। धन्यवाद फिर से –

+0

बेशक WatiN वास्तव में यूनिट परीक्षण के बारे में नहीं है बल्कि एकीकरण/कार्यात्मक है, लेकिन सिर्फ इसलिए कि आप इकाई परीक्षण धावक चलाते हैं, इसका मतलब यह नहीं है कि इसे यूनिट परीक्षण होना चाहिए। यदि आप यूनिट टेस्ट इंफ्रास्ट्रक्चर के आधार पर कार्यात्मक/एकीकरण परीक्षण लिखते हैं, तो आपको यूनिट टेस्ट के साथ धावक, रिपोर्टिंग, वीएस एकीकरण मिलता है, जो कि बड़ा लाभ है, खासकर यदि आप इसे सीआई सर्वर पर चलाने के लिए चाहते हैं, जहां आपका परीक्षण हर बार नया होता है आवेदन का निर्माण तैनात किया गया है। – yoosiba

8

मैं इस एक ही बात के लिए देख रहा था, और jvmenen का जवाब मुझे बाहर में मदद की। हालांकि, वेटन को कुछ अपडेट दिए गए हैं क्योंकि उत्तर दिया गया था, इसलिए मुझे नवीनतम WatiN संस्करण (वर्तमान में 2.0.20) के अनुरूप होने के लिए सहायक वर्ग को थोड़ा सा लिखना पड़ा।

WatiN में अब IE.AttachToIE फ़ंक्शन नहीं है, इसलिए मुझे इसे थोड़ा संशोधित करना पड़ा। इसके अलावा मैंने जेनेरिक का उपयोग करके सहायक वर्ग भी बनाया है, ताकि किसी भी ब्राउज़र प्रकार का उपयोग किया जा सके और न केवल आईई (मुझे विश्वास है कि आईई और फ़ायरफ़ॉक्स अब WatiN द्वारा समर्थित है, और क्रोम आना है)।

तो किसी और मामले किसी में भी इस की तलाश में है, यहाँ IEStaticInstanceHelper (अब StaticBrowserInstanceHelper कहा जाता है) के अपने संस्करण है:

class StaticBrowserInstanceHelper<T> where T : Browser 
{ 
    private Browser _browser; 
    private int _browserThread; 
    private string _browserHwnd; 

    public Browser Browser 
    { 
     get 
     { 
      int currentThreadId = GetCurrentThreadId(); 
      if (currentThreadId != _browserThread) 
      { 
       _browser = Browser.AttachTo<T>(Find.By("hwnd", _browserHwnd)); 
       _browserThread = currentThreadId; 
      } 
      return _browser; 
     } 
     set 
     { 
      _browser = value; 
      _browserHwnd = _browser.hWnd.ToString(); 
      _browserThread = GetCurrentThreadId(); 
     } 
    } 

    private int GetCurrentThreadId() 
    { 
     return Thread.CurrentThread.GetHashCode(); 
    } 
} 

आशा इस किसी :)

संबंधित मुद्दे