2012-03-30 19 views
12

मैं Approval Tests का उपयोग कर रहा हूं। मेरे देव मशीन पर मैं DiffReporter कि TortoiseDiff शुरू होता है के साथ खुश हूँ जब मेरे परीक्षण के परिणाम को मंजूरी दे दी से अलग:टीमसिटी पर स्वीकृति परीक्षण का उपयोग कैसे करें?

[UseReporter(typeof (DiffReporter))] 
    public class MyApprovalTests 
    { ... } 

लेकिन जब एक ही परीक्षण Teamcity और परिणाम पर चल रहे हैं विभिन्न परीक्षणों हैं निम्न त्रुटि के साथ विफल:

System.Exception : Unable to launch: tortoisemerge.exe with arguments ... 
Error Message: The system cannot find the file specified 
---- System.ComponentModel.Win32Exception : The system cannot find the file 
                   specified 

स्पष्ट रूप से यह tortoisemerge.exe नहीं ढूंढ सकता है और यह ठीक है क्योंकि यह बिल्ड एजेंट पर स्थापित नहीं है। लेकिन अगर यह स्थापित हो जाता है तो क्या होगा? फिर प्रत्येक विफल होने के लिए tortoisemerge.exe का एक और उदाहरण शुरू होगा और कोई भी इसे बंद नहीं करेगा। आखिरकार tortoisemerge.exe उदाहरणों के टन हमारे सर्वर को मार देंगे :)

तो सवाल यह है कि - स्थानीय मशीन पर टोर्टोइस डिफ चलाने के लिए परीक्षणों को कैसे सजाया जाना चाहिए और बस सर्वर पर त्रुटियों की रिपोर्ट करें? मुझे #IF DEBUG [UseReporter(typeof (DiffReporter))] से अवगत है, लेकिन यदि संभव हो तो एक और समाधान पसंद करेंगे।

+0

आप हमें पता ApprovalTests के किस संस्करण उपयोग कर रहे हैं कर सकते हैं? –

+0

संस्करण 1.0.4381.19674 –

+1

ठीक है। मैं उत्सुक था क्योंकि 1.17 में डिफ रिपोर्टर को अंततः छोड़ने और बस आर्टर्ट या क्विट रिपोर्टर को कॉल करने से पहले कुछ अलग-अलग संवाददाताओं को आजमाने के लिए तैयार किया गया है। तो, नवीनतम संस्करण में आपको उस अपवाद को नहीं देखना चाहिए, हालांकि यह वास्तव में आपके प्रश्न का उत्तर नहीं देता है कि अगर कोई TortiseSVN इंस्टॉल करता है तो क्या होगा। मैं आपको बता सकता हूं कि CC.NET पर, कुछ नहीं होता ... TortiseMerge सर्वर पर लॉन्च नहीं होता है। –

उत्तर

9

रिपोर्टर और सीआई के प्रश्न के कुछ समाधान हैं। मैं उन सभी को सूचीबद्ध करूंगा, फिर एक बेहतर समाधान को इंगित करें, जो कि है जो अभी तक सक्षम नहीं है।

  1. AppConfigReporter का प्रयोग करें। यह आपको अपने AppConfig में रिपोर्टर सेट करने की अनुमति देता है, और आप सीआई के लिए QuietReporter का उपयोग कर सकते हैं। कई अन्य पत्रकारों के साथ यहां एक वीडियो है। AppConfigReporter 6:00 बजे दिखाई देता है। इसमें अलग-अलग कॉन्फ़िगरेशन का लाभ है, और आप असेंबली स्तर पर सजाने के लिए तैयार हो सकते हैं, लेकिन अगर आप कक्षा/विधि स्तर पर ओवरराइड करते हैं तो इसका नुकसान होता है, फिर भी आपको समस्या है।

  2. अपना खुद का (2) संवाददाता बनाएं। यह ध्यान देने योग्य है कि यदि आप एक संवाददाता का उपयोग करते हैं, तो यह कहा जाएगा कि यह पर्यावरण में काम कर रहा है या नहीं।IEnvironmentAwareReporter समग्र संवाददाताओं के लिए अनुमति देता है, लेकिन संवाददाता को सीधी कॉल को नहीं रोकेगा। अधिकतर आपको 2 संवाददाताओं की आवश्यकता होगी, जो कुछ भी नहीं करता (एक शांत संवाददाता की तरह) लेकिन केवल आपके सीआई सर्वर पर काम करता है, या जब टीमसिटी द्वारा बुलाया जाता है। इसे टीमसिटी रिपोर्टर कहलाएगा। और वन, जो एक मल्टी रिपोर्टर है जो टीमसिटी को कॉल करता है अगर यह काम कर रहा है, अन्यथा इसे रोकता है।

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

उम्मीद है कि इससे मदद मिलती है। Llewellyn

+0

धन्यवाद करने के लिए लगता है लगता है जैसे मैं अनुमोदन 1.8 में बिंदु –

+0

अब आप जोड़ सकते हैं मिल गया [विधानसभा: FrontLoadedReporter (typeof (NCrunchReporter))] यह केवल है असेंबली स्तर पर अनुमति दी, और एक आईएन पर्यावरण पर्यावरणवेयर होना चाहिए। यदि वर्तमान माहौल में संवाददाता की अनुमति है, तो यह अन्य सभी पत्रकारों को बाधित करेगा। यह बिल्ड सिस्टम के लिए बहुत उपयोगी है जहां आप पत्रकारों के व्यवहार को ओवरराइड करना चाहते हैं। अभी तक कोई टीमसिटी रिपोर्टर नहीं है, लेकिन यदि आप चाहते हैं, तो मुझे एक बनाने के लिए w/you को जोड़कर खुशी होगी। (टीमसिटी का उपयोग न करें ...) –

2

मैं अभी एक छोटे से विचार के साथ आया था।

आप अपनी खुद की रिपोर्टर लागू कर सकते हैं, चलो यह DebugReporter

public class DebugReporter<T> : IEnvironmentAwareReporter where T : IApprovalFailureReporter, new() 
{ 
    private readonly T _reporter; 

    public static readonly DebugReporter<T> INSTANCE = new DebugReporter<T>(); 

    public DebugReporter() 
    { 
     _reporter = new T(); 
    } 

    public void Report(string approved, string received) 
    { 
     if (IsWorkingInThisEnvironment()) 
     { 
      _reporter.Report(approved, received); 
     } 
    } 

    public bool IsWorkingInThisEnvironment() 
    { 
#if DEBUG 
     return true; 
#else 
     return false; 
#endif 
    } 
} 

उपयोग के उदाहरण फोन,

[UseReporter(typeof(DebugReporter<FileLauncherReporter>))] 
public class SomeTests 
{ 
    [Test] 
    public void test() 
    { 
     Approvals.Verify("Hello"); 
    } 
} 

, यह अभी भी लाल हो जाएगा करते हैं, तो परीक्षण faling है - लेकिन रिपोर्टर आया नहीं होता ।

IEnvironmentAwareReporter विशेष रूप से इसके लिए परिभाषित किया गया है, लेकिन दुर्भाग्यवश जो कुछ भी मैं वहां लौटता हूं, वह अभी भी रिपोर्ट() विधि को कॉल करता है। इसलिए, मैंने IsWorkingInThisEnvironment() को अंदर कॉल किया है, जो थोड़ा हैकिश है, लेकिन काम करता है :)

आशा है कि Llywelyn यह समझा सकता है कि यह ऐसा क्यों करता है। (बग?)

+0

ऐसा लगता है जैसे IsWorkingInThisEnvironment() को 'फर्स्टवर्क्सिंग रिपोर्टर' जैसे समग्र पत्रकारों द्वारा उपयोग किया जाता है और यह आवश्यक नहीं है कि जब भी रिपोर्टर को आपके द्वारा उदाहरण में किया गया है, तो हर बार कहा जाता है। –

1

मैं CC.NET का उपयोग कर रहा हूं और मेरे पास सर्वर पर TortoiseSVN स्थापित है।

मैंने अपने निर्माण सर्वर को फिर से कॉन्फ़िगर किया ताकि CC.NET सेवा डेस्कटॉप के साथ संवाद करने की अनुमति दे सके। जब मैंने ऐसा किया, तो TortiseMerge लॉन्च हुआ। इसलिए मुझे लगता है कि क्या हो रहा है कि स्वीकृतियां उपकरण लॉन्च करने का प्रयास करती हैं, लेकिन ऐसा नहीं हो सकता क्योंकि CC.NET एक सेवा के रूप में चल रहा है और ऑपरेटिंग सिस्टम डिफ़ॉल्ट रूप से उस व्यवहार को रोकता है। यदि टीमसिटी एक सेवा के रूप में चलता है, तो आपको ठीक होना चाहिए, लेकिन आप परीक्षण करना चाहेंगे।

+0

मैंने स्वीकृति परीक्षण के नवीनतम संस्करण में अपडेट किया और अब कछुए की शुरुआत में विफल होने पर यह 'XUnitReporter' चलाने की कोशिश करता है। Unfortunatelly यह एक बग है कि लेवेलिन उम्मीद है कि जल्द ही ठीक कर देंगे :) –

4

मैं हाल ही में इस समस्या में आया हूं।

xunit से उधार और टीमसिटी लॉगिंग के साथ वे कैसे निपटते हैं मैं एनसीआरंच रिपोर्टर के आधार पर टीमसिटी रिपोर्टर के साथ आया था।

public class TeamCityReporter : IEnvironmentAwareReporter, IApprovalFailureReporter 
{ 
    public static readonly TeamCityReporter INSTANCE = new TeamCityReporter(); 

    public void Report(string approved, string received) { } 

    public bool IsWorkingInThisEnvironment(string forFile) 
    { 
     return Environment.GetEnvironmentVariable("TEAMCITY_PROJECT_NAME") != null; 
    } 
} 

और इसलिए मैं NCrunch रिपोर्टर के साथ संयोजित कर सकते हैं:

public class TeamCityOrNCrunchReporter : FirstWorkingReporter 
{ 
    public static readonly TeamCityOrNCrunchReporter INSTANCE = 
     new TeamCityOrNCrunchReporter(); 

    public TeamCityOrNCrunchReporter() 
     : base(NCrunchReporter.INSTANCE, 
     TeamCityReporter.INSTANCE) { } 
} 

[assembly: FrontLoadedReporter(typeof(TeamCityOrNCrunchReporter))] 
+0

इसे प्यार करो! इसे अभी स्वीकृति परीक्षण (v.21) में जोड़ना। –

+1

@llewellynfalco जागरूक रहें, मुझे रिलीज मोड में अपने परीक्षण चलाने में समस्याएं थीं क्योंकि सीएलआर टेस्ट विधि को रेखांकित कर रहा था, इसलिए यह स्टैकट्रैक में दिखाई नहीं दे रहा था और इस प्रकार स्वीकृति टेस्ट इसे नहीं मिला। मुझे काम करने से पहले परीक्षण विधि में '[MethodImpl (MethodImplOptions.NoInlining)]' जोड़ना पड़ा था। यह xUnit में था। कुछ पता होना चाहिए। –