Nunit: コンソールNUnit3でのテストの作業ディレクトリ

作成日 2015年11月26日  ·  21コメント  ·  ソース: nunit/nunit

NUnit 2.6.4では、テストの作業ディレクトリは、テストDLLの対応するbin/Debugディレクトリに設定されていました。 これにより、相対パスによるテストで外部ファイルをロードできました。

現在、作業ディレクトリはコンソールランナーの作業ディレクトリに設定されているようです。 これは仕様によるものですか?

テストの作業ディレクトリをbin/Debug設定したまま、コンソールランナーの作業ディレクトリにテスト結果(* .xmlファイル)を残すにはどうすればよいですか?

notabug

最も参考になるコメント

@imakowskiアセンブリセットアップで、現在の作業ディレクトリを既知のディレクトリに設定しようとしましたか? テストされていないコードですが、次のようなものです。

`` `C#
[SetUpFixture]
パブリッククラスMySetUpClass
{{
[OneTimeSetUp]
RunBeforeAnyTests()
{{
var dir = Path.GetDirectoryName(typeof(MySetUpClass).Assembly.Location);
Environment.CurrentDirectory = dir;

    // or
    Directory.SetCurrentDirectory(dir);
}

}
`` `

全てのコメント21件

これは、次のように設計によるものです: https

以前のバージョンでは、NUnitは作業ディレクトリを変更しました。 それはもはやそうしません。 TestContext.TestDirectoryを使用して、テストアセンブリを含むディレクトリを取得できます。

新しいURL: https

これは多くのテストを破ります! なぜあなたはそれを変えたのですか? テストされたアプリのランタイムコードには、作業ディレクトリがテストアセンブリの場所であるという依存関係があったため、一部のテストを修正できません。

@imakowskiアセンブリセットアップで、現在の作業ディレクトリを既知のディレクトリに設定しようとしましたか? テストされていないコードですが、次のようなものです。

`` `C#
[SetUpFixture]
パブリッククラスMySetUpClass
{{
[OneTimeSetUp]
RunBeforeAnyTests()
{{
var dir = Path.GetDirectoryName(typeof(MySetUpClass).Assembly.Location);
Environment.CurrentDirectory = dir;

    // or
    Directory.SetCurrentDirectory(dir);
}

}
`` `

@imakowskiはそれを制御できないかもしれませんが、コード/アプリケーションは設定されている現在の作業ディレクトリに依存するべきではありません。 アプリケーションは常に、上記のようなコードを使用してbinディレクトリを決定する必要があります。 Windowsには、気付かないうちに現在の作業ディレクトリを変更するAPI呼び出しがいくつかあります。 ほとんどの場合、アプリケーションは正常に実行できますが、ユーザーがアプリケーションのほとんど使用されない部分にアクセスすると失敗します。

@rprouseがシャドウコピーモードの場合、このコードは機能しません
var dir = Path.GetDirectoryName(typeof(MySetUpClass).Assembly.Location);

その場合、これを使用できます。
var dir = Path.GetDirectoryName(new Uri(typeof(MySetUpClass).Assembly.CodeBase).LocalPath);

または、TestContext.CurrentContext.TestDirectoryとして提供します。 :-)

特別な場合のためにいくつかの調整を加えて、提案されているようにURIを使用します。

または、TestContext.CurrentContext.TestDirectoryとして提供します。 :-)

CurrentContextにTestDirectoryプロパティはもうありません。 nunit3.6.1を使用しています。 私の場合、リシャーパーからテストを開始したときに間違った場所を指しているWorkDirectoryだけがあります:(

TestContext.TestDirectoryがあります。 これは静的プロパティです。 WorkDirectoryもそうだと思いますか?

まあ、私はビジュアルスタジオブラウザまたはコンパイラまたはテレリック逆コンパイラを使用してそれを見つけることができません。
しかし、私はそれをnunit3.5で見ています。 何が悪いのかわからない

私は間違っていた。

TestContext.CurrentContext.TestDirectoryです。

ただし、PORTABLEビルドにはありません。

#if !PORTABLE
        /// <summary>
        /// Gets the directory containing the current test assembly.
        /// </summary>
        public string TestDirectory
        {
            get
            {
                Assembly assembly = _testExecutionContext?.CurrentTest?.TypeInfo?.Assembly;

                if (assembly != null)
                    return AssemblyHelper.GetDirectoryName(assembly);

#if NETSTANDARD1_6
                // Test is null, we may be loading tests rather than executing.
                // Assume that the NUnit framework is in the same directory as the tests
                return AssemblyHelper.GetDirectoryName(typeof(TestContext).GetTypeInfo().Assembly);
#else
                // Test is null, we may be loading tests rather than executing.
                // Assume that calling assembly is the test assembly.
                return AssemblyHelper.GetDirectoryName(Assembly.GetCallingAssembly());
#endif
            }
        }
#endif

3.6.0にはありますが、3.6.1にはありません。

現在のgithubリポジトリを確認していますが、上記でコピーして貼り付けたものとまったく同じです。

どういうわけかPORTABLEビルドを使用していないのですか?

はい、私はそれを使用しています

まあ、それがそこにない理由です。 私の知る限り、PORTABLEビルドではサポートされておらず、サポートされたこともありません。 ただし、PORTABLEビルドを使用したことはなく、CIテストを実行するだけです。

ありがとうございました

Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);

@CharliePoole@rprouseが言ったことをまとめて、実際のコードに目を向けている人にとっては、

[SetUpFixture]
public class MySetUpClass
{
    [OneTimeSetUp]
    public void RunBeforeAnyTests()
    {
        Environment.CurrentDirectory = TestContext.CurrentContext.TestDirectory;
        // or identically under the hoods
        Directory.SetCurrentDirectory(TestContext.CurrentContext.TestDirectory);
    }
}

グローバル初期化用

上記のロジックを名前空間に含めないでください。 NS

using NUnit.Framework;
using System;
using System.IO;

[SetUpFixture]
public class GlobalSetup
{
    [OneTimeSetUp]
    public void RunBeforeAnyTests()
    {
        Environment.CurrentDirectory = TestContext.CurrentContext.TestDirectory;
        // or identically under the hoods
        Directory.SetCurrentDirectory(TestContext.CurrentContext.TestDirectory);
    }
}

また、 TestContext.CurrentContext.TestDirectoryはコーナーケースに対処するためのインテリジェンスがいくつかあるようですので、 typeof(MySetUpClass).Assembly.Location以上のものを選びます

typeof(MySetUpClass).Assembly.Locationよりもそれを選びます

Locationは、アセンブリがシャドウコピーされている場合、シャドウの場所を返します。通常、これは望ましくありません。 代わりにCodeBase使用してください。これにより、シャドウコピーの前に、最初に実行された実際の場所のUriが返されます。

明らかにTestDirectoryを使用する方が良いですが、そのプロパティに問題があるようです。#2872を参照して、キャッチできない例外を引き起こします。 OneTimeSetupを使用した場合にも表示されるかどうかはわかりませんが(そうではないと思います)、対処するまで注意が必要です。

このページは役に立ちましたか?
0 / 5 - 0 評価