1

私は次のテスト フィクスチャ クラスを持っていますが、私には理解できない理由により、NUnit はこれ以外のすべてのテスト クラスを実行することにしました。

using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;   
using MyProject;
using NUnit.Framework;

namespace MyProject.Test
{
    [TestFixture]
    public class MyProjectTests
    {
        private const string Description = "This is a test Description generated through UNIT Tests";

        private ManualWorkflowSchedulerService scheduler;
        private WorkflowRuntime workflowRuntime;

        [SetUp]
        public void Init()
        {
            // set up workflow scheduler and runtime
            this.workflowRuntime = new WorkflowRuntime();
            this.scheduler = new ManualWorkflowSchedulerService(true); // run synchronously
            this.workflowRuntime.AddService(this.scheduler);
            this.workflowRuntime.StartRuntime();

            // create Test Case Sources
            object[] insertScenarios = 
                {
                    new object[] { typeof(RaiseScenario), this.workflowRuntime, Description, true, true, string.Empty },
                    new object[] { typeof(RaiseScenario), this.workflowRuntime, Description, true, false, "New Reason" }
                };
        }

        /// <summary>
        /// The insert tests.
        /// </summary>
        /// <param name="runtime">
        /// The runtime.
        /// </param>
        /// <param name="description">
        /// The description.
        /// </param>
        /// <param name="outstandingWorkDocUploaded">
        /// The Doc One Uploaded.
        /// </param>
        /// <param name="DocTwoUploaded">
        /// The Doc Two Uploaded.
        /// </param>
        /// <param name="shortageReason">
        /// The shortage Reason.
        /// </param>
        [Test, TestCaseSource("insertScenarios")]
        public void TestInsert(
            WorkflowRuntime runtime,
            string description,
            bool DocOneUploaded,
            bool DocTwoUploaded,
            string Reason)
        {
            var message = Business.InsertBoatHandoverOutsideCrew(runtime, description, DocOneUploaded, DocTwoUploaded, Reason);
            Assert.AreNotEqual(0, message.Id);
        }

    }
}

テスト プロジェクトの構造は、構成要素に分割されます。つまり、ソリューションの各サブ プロジェクトには、テスト プロジェクト内に独自のディレクトリがあります。これは、.Net 3.5 でコーディングされた他のすべてのプロジェクトでは問題ではありませんでしたが、このプロジェクトのテストは現在無視されています。

4

4 に答える 4

3

テストケースを外した場合、これは機能するはずですSetUp

// create Test Case Sources
public object[] insertScenarios = 
        {
            new object[] { typeof(RaiseScenario), this.workflowRuntime, Description, true, true, string.Empty },
            new object[] { typeof(RaiseScenario), this.workflowRuntime, Description, true, false, "New Reason" }
        };

/// <summary>
/// The init.
/// </summary>
[SetUp]
public void Init()
{
    // set up workflow scheduler and runtime
    this.workflowRuntime = new WorkflowRuntime();
    this.scheduler = new ManualWorkflowSchedulerService(true); // run synchronously
    this.workflowRuntime.AddService(this.scheduler);
    this.workflowRuntime.StartRuntime();

}
于 2012-08-22T12:20:26.767 に答える
1

テストフィクスチャがNUnitによって無視されるべき理由がまだわかりません(投稿されたコードスニペットに基づいて)。コード スニペットに何か不足がありますか?

ウィクトルが指摘したように、

sourceName 引数は、テスト ケースを提供するために使用されるソースの名前を表します。次の特徴があります。 フィールド、プロパティ、またはメソッドの場合があります。インスタンスまたは静的メンバーのいずれかです。IEnumerable または IEnumerable を実装する型を返す必要があります。列挙子によって返される個々の項目は、属性が表示されるメソッドのシグネチャと互換性がある必要があります。

ただし、上記のコード スニペットを使用すると、特定のテストが無効ではなく無視されているとマークされているはずです (Fwk 4.0 で NUnit v2.5.10 を使用)。

namespace AJack
{
    [TestFixture]
    public class ParameterizedTestsDemo
    {
        private object[][] _inputs;

        public ParameterizedTestsDemo()
        {
            Console.Out.WriteLine("Instantiating test class instance");
            _inputs = new[]{ new object[]{1,2,3}, 
                                 new object[]{4,5,6} }; 
        }

        [TestFixtureSetUp]
        public void BeforeAllTests()
        {
            Console.Out.WriteLine("In TestFixtureSetup");
            object[] localVarDoesNotWork = {   new object[]{1,2,3}, 
                                    new object[]{4,5,6} };
            /*this will NOT work too
            _inputs = new[]{ new object[]{1,2,3}, 
                                 new object[]{4,5,6} }; */
        }

        [TestCaseSource("localVarDoesNotWork")]
        public  void WillNotRun(int x, int y, int z)
        {
            Console.Out.WriteLine("Inputs {0}, {1}, {2}", x,y,z);
        }
        [TestCaseSource("PropertiesFieldsAndMethodsWork")]
        public void TryThisInstead(int x, int y, int z)
        {
            Console.Out.WriteLine("Inputs {0}, {1}, {2}", x, y, z);
        }
        private object[] PropertiesFieldsAndMethodsWork
        {
            get {
                Console.Out.WriteLine("Getting test input params");

                return _inputs;
            }
        }
    }
}

Console.Out.WriteLines にトレースポイントを設定し、デバッガーをアタッチすると、アセンブリが読み込まれる (テスト ツリーが構築される) ときに、トレースポイント ヒットが次のように表示されます。

Test Class constructor
Retrieve test case inputs from property/field/method

テストを実行すると、

Test Class constructor
InTestFixtureSetup

つまり、これを機能させるには、テスト クラス ctor にインスタンス フィールドを割り当てる必要があります。パラメーター化されたテスト入力が解決されるときに呼び出されないため、Setup メソッドを使用することはできません。また、入力を解決できない場合は、次のような例外で赤が表示されるはずです

AJack.ParameterizedTestsDemo.WillNotRun:
System.Exception : Unable to locate AJack.ParameterizedTestsDemo.localVarDoesNotWork
于 2012-08-23T06:13:15.533 に答える
0

その場合のif条件を適用でき、このif条件が[TestFixtureSetUp]属性に適用され、そのif条件でAssert.Ignore( "")を使用できます。

于 2012-08-22T12:52:26.510 に答える
0

void が引数を取るテストケースを見たことがありません。これを行うつもりですか? これが、このクラスのテストが実行されない理由だと思います。

[Test, TestCaseSource("insertScenarios")]
public void TestInsert()
{
    WorkflowRuntime runtime = //some value;
    string description = //some value; 
    bool DocOneUploaded = //some value;
    bool DocTwoUploaded = //some value;
    string Reason = //some value;

    var message = Business.InsertBoatHandoverOutsideCrew(runtime, description, DocOneUploaded, DocTwoUploaded, Reason);
    Assert.AreNotEqual(0, message.Id);
}

Init()この値が本当にテストケース外に必要な場合は、 Exampleで設定できる vaiable として外部で指定します。

private WorkflowRuntime RunTime;

    [Setup]
    public void Init()
    {
    RunTime = new WorkflowRuntime();
    }

    [Test]
    public void TestInsert()
    {
    //RunTime can now be accessable here.
    }
于 2012-08-22T12:01:18.600 に答える