2012-08-31 17 views
7

सबसे पहले मैं SpecFlow के लिए नया हूं।SpecFlow: ClassInitialize और TestContext

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

गैर-स्पीकफ़्लो कार्यात्मक परीक्षणों में मैं TestContext से TestDeploymentDir प्राप्त करने के लिए क्लासइनाइजलाइज विशेषता का उपयोग कर रहा था; कुछ इस तरह:

[ClassInitialize] 
public static void ClassSetup(TestContext context) 
{ 
    TargetDataDeploymentRoot = context.TestDeploymentDir; 
} 

अब SpecFlow साथ मैं यह विशेषता अब और उपयोग नहीं कर सकते के रूप में यह SpecFlow से ही किया जाता है। कुछ नए गुण मौजूद हैं, जैसे पहले फीचर जो समान रूप से कार्य करता है लेकिन यह पैरामीटर के रूप में TestContext को पास नहीं करता है।

मुझे केवल अपने कार्यात्मक परीक्षण सर्वर को लॉच करने से पहले कुछ फ़ाइलों की प्रतिलिपि बनाने के लिए टेस्टकॉन्टेक्स्ट के टेस्ट डिप्लॉयमेंटडियर तक पहुंच प्राप्त करने की आवश्यकता है - SpecFlow के बिना आसानी से करने योग्य लेकिन SpecFlow के साथ लगभग असंभव है।

इस मुद्दे से कैसे निपटें?

क्या यह संभव है?

धन्यवाद सलाह के लिए बहुत कुछ!

रॉबर्ट


पर्यावरण:

  • Visual Studio 2012
  • SpecFlow 1.9.0.77
+0

आप specflow के साथ अपने सुविधा fiels से MSTest परीक्षण उत्पन्न कर सकते हैं: //stackoverflow.com/questions/2984318/how-to-run-specflow-tests-in-visual-studio-2010 – nemesv

+2

प्रतिक्रिया के लिए धन्यवाद। मैं पहले से ही अपनी फीचर फाइलों से एमएसटीएस्ट टेस्ट जेनरेट कर रहा हूं, लेकिन जैसा ऊपर बताया गया है, मेरे पास टेस्टकॉन्टेक्स्ट तक कोई पहुंच नहीं है। –

+3

शायद [विधानसभा आरंभ] (http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.assemblyinitializeattribute (v = vs.80) .aspx) आपके परिदृश्य के लिए काम कर सकता है, specflow don इसका इस्तेमाल नहीं करें। अन्यथा वर्तमान 'MsTestGeneratorProvider' जेनरेट की गई फीचर फाइलों के साथ आपको सिद्ध 'टेस्टकॉन्टेक्स्ट' नहीं मिल सकता है। हालांकि आप 'MsTestGeneratorProvider' से प्राप्त कर सकते हैं और परीक्षण उत्पन्न कर सकते हैं जो specflow के अंदर कहीं भी' टेस्टकॉन्टेक्स्ट 'स्टोर करता है। – nemesv

उत्तर

-1

एक FeatureContext रूप में अच्छी तरह और अधिक सामान्यतः इस्तेमाल किया के रूप में नहीं है ScenarioCont ext। पाठ्यक्रम का अंतर यह है कि फ़ीचरकॉन्टेक्स्ट पूर्ण सुविधा के निष्पादन के दौरान मौजूद है जबकि परिदृश्य कॉन्टेक्स्ट केवल एक परिदृश्य के दौरान मौजूद है।

उदाहरण के लिए:

संदर्भ में जोड़ें:

ScenarioContext.Current.Add("ObjectName", myObject); 

प्राप्त करें:

var myObject = ScenarioContext.Current.Get<object>("ObjectName"); 

आप इसे here के बारे में अधिक पढ़ सकते हैं।

+0

सुप्रभात, मैंने इसे देखा है और यह ठीक होगा अगर मैं वहां टेस्टकॉन्टेक्स्ट की संपत्ति कर सकता हूं। यह कैसे संभव होगा? यह मेरे लिए एक अवरुद्ध मुद्दा है! सलाह के लिए बहुत बहुत धन्यवाद, रॉबर्ट –

3

टेस्टकॉन्टेक्स्ट में मानों तक पहुंच प्राप्त करने के लिए आपको प्रत्येक परिदृश्य फ़ाइल के लिए आंशिक कक्षा बनाना है जिसमें आप जोड़ते हैं।

using Microsoft.VisualStudio.TestTools.UnitTesting; 
using TechTalk.SpecFlow; 

/// <summary> 
/// Partial class for TestContext support. 
/// </summary> 
public partial class DistributionFeature 
{ 
    /// <summary> 
    /// Test execution context. 
    /// </summary> 
    private TestContext testContext; 

    /// <summary> 
    /// Gets or sets test execution context. 
    /// </summary> 
    public TestContext TestContext 
    { 
     get 
     { 
      return this.testContext; 
     } 

     set 
     { 
      this.testContext = value; 

      //see https://github.com/techtalk/SpecFlow/issues/96 
      this.TestInitialize(); 
      FeatureContext.Current["TestContext"] = value; 
     } 
    } 
} 

तो फिर तुम

var testContext = (TestContext)FeatureContext.Current["TestContext"]; 
var deploymentDir = testContext.TestDeploymentDir; 

का उपयोग कर आप भी कई परिदृश्यों है, तो आपके कदमों से तैनाती निर्देशिका का उपयोग कर सकता है, तो आप शायद टी -4 जैसे कि वे फाइलें के निर्माण को स्वचालित करने के है।

+0

यदि आप इस तकनीक का उपयोग कर रहे हैं, तो जब आप SpecFlow 2.2.1 में अपग्रेड करते हैं, तो आपको चीजों को थोड़ा सा संशोधित करने की आवश्यकता होती है। यहां एक नज़र डालें: https://github.com/techtalk/SpecFlow/issues/936 –

3

आप एक प्लगइन बना सकते हैं और IUnitTestGeneratorProvider कार्यान्वयन को कस्टमाइज़ कर सकते हैं। निम्नलिखित में एमएसटीएस्ट की कक्षा शुरू करने के लिए लाइन जोड़नी चाहिए।

// It's very important this is named Generator.SpecflowPlugin. 
namespace MyGenerator.Generator.SpecflowPlugin 
{ 
    public class MyGeneratorProvider : MsTest2010GeneratorProvider 
    { 
     public MyGeneratorProvider(CodeDomHelper codeDomHelper) 
      : base(codeDomHelper) 
     { 
     } 

     public override void SetTestClassInitializeMethod(TestClassGenerationContext generationContext) 
     { 

      base.SetTestClassInitializeMethod(generationContext); 

generationContext.TestClassInitializeMethod.Statements.Add(new CodeSnippetStatement(
                     @"TargetDataDeploymentRoot = context.TestDeploymentDir;")); 

     } 

    } 


[assembly: GeneratorPlugin(typeof(MyGeneratorPlugin))] 

    public class MyGeneratorPlugin : IGeneratorPlugin 
    { 
     public void RegisterDependencies(ObjectContainer container) 
     { 
     } 

     public void RegisterCustomizations(ObjectContainer container, SpecFlowProjectConfiguration generatorConfiguration) 
     { 
      container.RegisterTypeAs<MyGeneratorProvider, IUnitTestGeneratorProvider>(); 
     } 

     public void RegisterConfigurationDefaults(SpecFlowProjectConfiguration specFlowConfiguration) 
     { 
     } 
    } 

} 

और App.config फ़ाइल में इसे संदर्भ:

<specFlow> 
    <plugins> 
     <add name="MyGenerator" type="Generator"/> 
    </plugins> 
</specFlow> 

अगली बार जब आप .फ़ीचर फिर से सहेज फ़ाइलें ClassInitialize में उत्पन्न कोड TargetDataDeploymentDirectory स्थापित करना चाहिए।

मुझे कुछ ऐसा करना पड़ा। यहां मेरा कामकाजी कोड https://github.com/marksl/Specflow-MsTest और ब्लॉग पोस्ट http://codealoc.wordpress.com/2013/09/30/bdding-with-specflow/

0

स्पीकफ़्लो 2.2.1 के बाद से टेस्टकॉन्टेक्स्ट संदर्भ इंजेक्शन के माध्यम से उपलब्ध है। (https://github.com/techtalk/SpecFlow/pull/882)

आप सीधे कंटेनर से प्राप्त कर सकते हैं: संदर्भ इंजेक्शन के जरिए

ScenarioContext.Current.ScenarioContainer.Resolve<Microsoft.VisualStudio.TestTools.UnitTesting.TestContext>()

या http:

public class MyStepDefs 
{ 
    private readonly TestContext _testContext; 
    public MyStepDefs(TestContext testContext) // use it as ctor parameter 
    { 
     _testContext = testContext; 
    } 

    [BeforeScenario()] 
    public void BeforeScenario() 
    { 
     //now you can access the TestContext 
    } 
} 
संबंधित मुद्दे