Тесты Specflow с помощью Nunit 3 Console Runner

Недавно я начал новый проект и решил использовать Specflow 2.1. Он поставляется с NUnit3.

В настоящее время проект настроен, и средство запуска тестов в Visual Studio выполняется правильно, однако, когда я пытаюсь запустить те же тесты из средства запуска консоли Nunit 3, я получаю сообщение об ошибке.

Я использую команду nunit3-console.exe --labels=All --framework=net-4.5 Blah.Testing.Specflow.dll

Я добавил два собственных теста Nunit с той же сборкой, и они работают нормально, это единственный тест specflow, который не работает.

NUnit Console Runner 3.2.1
Copyright (C) 2016 Charlie Poole

Runtime Environment
   OS Version: Microsoft Windows NT 10.0.10586.0
  CLR Version: 4.0.30319.42000

Test Files
    Blah.Testing.Specflow.dll

=> Blah.Testing.Specflow.MyTest.TestOne
=> Blah.Testing.Specflow.MyTest.TestTwo
=> Blah.Testing.Specflow.MyTestFeature.AddTwoNumbers

Errors and Failures

1) TearDown Error : Blah.Testing.Specflow.MyTestFeature
System.ArgumentNullException : Value cannot be null.
Parameter name: instance
TearDown : System.NullReferenceException : Object reference not set to an instance of an object.
   at BoDi.ObjectContainer.RegisterInstanceAs(Object instance, Type interfaceType, String name, Boolean dispose)
   at TechTalk.SpecRun.SpecFlowPlugin.Runtime.SpecRunTestRunnerManager.CreateTestRunnerInstance() in c:\TeamCity\BuildAgent\work\245a3e4d646c0875\SpecFlowPlugins\TechTalk.SpecRun.SpecFlowPlugin.2-0-0\Runtime\SpecRunTestRunnerManager.cs:line 33
   at TechTalk.SpecFlow.TestRunnerManager.CreateTestRunner(Int32 threadId)
   at TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(Int32 threadId)
   at TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(Assembly testAssembly, Nullable`1 managedThreadId)
   at Blah.Testing.Specflow.MyTestFeature.FeatureSetup() in D:\Projects\Blah\src\Testing\Blah.Testing.Specflow\MyTest.feature.cs:line 0
--TearDown
   at Blah.Testing.Specflow.MyTestFeature.FeatureTearDown() in D:\Projects\Blah\src\Testing\Blah.Testing.Specflow\MyTest.feature.cs:line 0

2) Error : Blah.Testing.Specflow.MyTestFeature.AddTwoNumbers
OneTimeSetUp: System.ArgumentNullException : Value cannot be null.
Parameter name: instance

Run Settings
    RuntimeFramework: net-4.5
    WorkDirectory: D:\Projects\Blah\src\Testing\Blah.Testing.Specflow\bin\Dev
    ImageRuntimeVersion: 4.0.30319
    ImageTargetFrameworkName: .NETFramework,Version=v4.5.1
    ImageRequiresX86: False
    ImageRequiresDefaultAppDomainAssemblyResolver: False
    NumberOfTestWorkers: 8

Test Run Summary
  Overall result: Failed
  Test Count: 3, Passed: 2, Failed: 1, Inconclusive: 0, Skipped: 0
    Failed Tests - Failures: 0, Errors: 1, Invalid: 0
  Start time: 2016-05-16 00:52:52Z
    End time: 2016-05-16 00:52:53Z
    Duration: 0.380 seconds

Results (nunit3) saved as TestResult.xml

Я попытался отразить сборку TechTalk.Specflow, чтобы взглянуть на метод CreateTestRunnerInstance, но не нашел ничего полезного, чтобы найти решение.

Сгенерированный код файла шага:

// ------------------------------------------------------------------------------
//  <auto-generated>
//      This code was generated by SpecFlow (http://www.specflow.org/).
//      SpecFlow Version:2.1.0.0
//      SpecFlow Generator Version:2.0.0.0
// 
//      Changes to this file may cause incorrect behavior and will be lost if
//      the code is regenerated.
//  </auto-generated>
// ------------------------------------------------------------------------------
#region Designer generated code
#pragma warning disable
namespace Blah.Testing.Specflow
{
    using TechTalk.SpecFlow;


    [System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "2.1.0.0")]
    [System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
    [NUnit.Framework.TestFixtureAttribute()]
    [NUnit.Framework.DescriptionAttribute("MyTest")]
    public partial class MyTestFeature
    {

        private TechTalk.SpecFlow.ITestRunner testRunner;

#line 1 "MyTest.feature"
#line hidden

        [NUnit.Framework.TestFixtureSetUpAttribute()]
        public virtual void FeatureSetup()
        {
            testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner();
            TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo("en-US"), "MyTest", "\tIn order to avoid silly mistakes\r\n\tAs a math idiot\r\n\tI want to be told the sum o" +
                    "f two numbers", ProgrammingLanguage.CSharp, ((string[])(null)));
            testRunner.OnFeatureStart(featureInfo);
        }

        [NUnit.Framework.TestFixtureTearDownAttribute()]
        public virtual void FeatureTearDown()
        {
            testRunner.OnFeatureEnd();
            testRunner = null;
        }

        [NUnit.Framework.SetUpAttribute()]
        public virtual void TestInitialize()
        {
        }

        [NUnit.Framework.TearDownAttribute()]
        public virtual void ScenarioTearDown()
        {
            testRunner.OnScenarioEnd();
        }

        public virtual void ScenarioSetup(TechTalk.SpecFlow.ScenarioInfo scenarioInfo)
        {
            testRunner.OnScenarioStart(scenarioInfo);
        }

        public virtual void ScenarioCleanup()
        {
            testRunner.CollectScenarioErrors();
        }

        [NUnit.Framework.TestAttribute()]
        [NUnit.Framework.DescriptionAttribute("Add two numbers")]
        [NUnit.Framework.CategoryAttribute("mytag")]
        public virtual void AddTwoNumbers()
        {
            TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Add two numbers", new string[] {
                        "mytag"});
#line 7
this.ScenarioSetup(scenarioInfo);
#line 8
 testRunner.Given("I am on the homepage", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
#line 9
testRunner.Then("I set the Implicit Wait to \"5000\"ms", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
#line 10
testRunner.Then("I take a screenshot called \"\"", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
#line hidden
            this.ScenarioCleanup();
        }
    }
}
#pragma warning restore
#endregion

Любая помощь будет оценена


person Ettienne    schedule 16.05.2016    source источник
comment
не могли бы вы предоставить код из ваших файлов шагов? а также шаг, которому присваивается [OneTimeSetUp], если он у вас есть   -  person Sam Holder    schedule 16.05.2016
comment
Я добавил сгенерированный файл. Похоже, что не создается OneTimeSetup Attrib для любого сгенерированного кода. Стоит отметить, что я использую поставщика тестов nunit ‹unitTestProvider name = nunit /›   -  person Ettienne    schedule 17.05.2016


Ответы (1)


Похоже, у вас также настроен плагин SpecFlow + Runner (SpecRun).

в TechTalk.SpecRun.SpecFlowPlugin .Runtime.SpecRunTestRunnerManager.CreateTestRunnerInstance () в c: \ TeamCity \ BuildAgent \ work \ 245a3e4d646c0875 \ SpecFlowPlugins \ TechTalk.SpecRungin.2-0 SpecFlowPlugins \ TechTalk. .cs: ​​строка 33

проверьте свои плагины и настройку unittestprovider в app.config. После этого повторно сгенерируйте все файлы кода программной части (просто сохраните файлы функций).

person Andreas Willich    schedule 19.05.2016
comment
Привет, @Andreas, большое спасибо за то, что это сработало! Я добавил поставщика тестов NUnit, но оставил плагин SpecRun на месте (у меня сложилось впечатление, что это было только для работы VS и не повлияло бы на сгенерированную сборку). Когда я удалил раздел плагина Specrun и восстановил код поддержки, все начало работать :) - person Ettienne; 01.06.2016
comment
Как вы решили проблему? У меня очень похожая проблема. Всякий раз, когда я запускаю тесты, он всегда отбрасывает исключение в файле SpecFlowNUnitExtension.cs, и это сводит меня с ума. В моем файле конфигурации установлено следующее: ‹unitTestProvider name = SpecRun + NUnit /› с SpecRun, установленным как Test Runner Tool в настройках. - person Jakubee; 01.06.2016
comment
@Jakubee Не могли бы вы открыть вопрос об этом здесь: github.com/techtalk/SpecFlow Чтобы решить вашу проблема Мне нужна дополнительная информация о вашей конфигурации, и это будет слишком для полей комментариев здесь. Спасибо! - person Andreas Willich; 01.06.2016