web-dev-qa-db-ja.com

Unityで単体テストをセットアップし、欠落しているアセンブリ参照エラーを修正する方法は?

次の構造を作成しました。

├── Assets
├── Scenes
├── Scripts
│   └── MyExample.cs
├── Tests
│   ├── MyExampleTest.cs
│   └── Tests.asmdef

ここで、Unityの[テストランナー]ウィンドウで[すべて実行]をクリックすると、次のエラーが発生します。

The type or namespace name `MyExample' could not be found. Are you missing an Assembly reference?

Visual Studioには、2つのプロジェクトがあります。

  • Assembly-CSharp(srcを含む)

  • テスト(テストを含む)

2番目のプロジェクトの参照としてAssembly-CSharpを追加しました。 Visual Studioは、エラーなしでソリューションを構築できます。

UnityプロジェクトのUnitTest回帰を適切に設定する方法を知っている人はいますか?

これはTests.asmdefです

{
    "name": "Tests",
    "optionalUnityReferences": [
        "TestAssemblies"
    ]
}

MyExampleTest.cs

using UnityEngine;
using UnityEngine.TestTools;
using NUnit.Framework;
using System.Collections;
using abc;

public class MyExampleTest{

    [Test]
    public void NewTestScriptSimplePasses() {
        // Use the Assert class to test conditions.
    }

    [UnityTest]
    public IEnumerator NewTestScriptWithEnumeratorPasses() {
        abc.Example m;
        Assert.That(false);
        yield return null;
    }
}

MyExample.cs

namespace abc
{
    public class Example
    {


    }
}
24
HAL9000

組み込みのテストランナーUIを使用して、テストアセンブリフォルダーと最初のテストスクリプトをセットアップしてみてください。

Window -> Test Runner -> EditMode -> "Create Test Assembly Folder"を使用し、新しいテストアセンブリフォルダーに移動したら、Create Test Script in current folderボタンを使用します。

特に、Tests.asmdefには、デフォルトのセットアップ(Unity 2018.1)と比較して「エディター」インクルードがありません。

{
    "name": "Tests",
    "optionalUnityReferences": [
        "TestAssemblies"
    ],
    "includePlatforms": [
        "Editor"
    ]
}

テストをセットアップするために、Visual Studioプロジェクトで手動で何もする必要はありません。

アセンブリファイルが次のように「Any Platform」に設定されている場合(質問のように):

{
    "name": "Tests",
    "optionalUnityReferences": [
        "TestAssemblies"
    ]
}

テストがテストランナーウィンドウに表示されません。

(前の例のように)「エディター」プラットフォームのみを含めるようにアセンブリファイルを明示的に設定すると、テストランナーウィンドウにテストが正しく表示されます。

(この動作は、私には少し直感に反するようです。)


また、スクリプトのアセンブリ定義を設定する必要があります。 Scriptsフォルダーの下に、アセンブリ定義ファイルMyScriptAssembly.asmdefを作成します(UnityメニューAssets -> Create -> Assembly Definitionを使用するか、手動で):

{
    "name": "MyScriptAssembly"
}

次に、Tests.asmdefがスクリプトアセンブリを参照していることを確認します。

{
    "name": "Tests",
    "references": [
        "MyScriptAssembly"
    ],
    "optionalUnityReferences": [
        "TestAssemblies"
    ],
    "includePlatforms": [
        "Editor"
    ],
    "excludePlatforms": [],
    "allowUnsafeCode": false
}

Unity Editorインスペクターウィンドウでこれを設定することもできます。 .asmdefファイルを選択する場合は、インスペクターの「参照」を参照してください。

Assembly definition inspector window

(詳細については、 アセンブリ定義ファイルに関するUnityのドキュメント を参照してください)

31
sonny

最終的に、これに適した適切なソリューションが見つかりました。そしてすべてがエディターを介して行われます。

したがって、テストアセンブリに実際のコードアセンブリを参照させることが目標です。そのためには、両方のアセンブリをdefineしてから、参照を1つに設定する必要があります。

  1. 通常どおりUnity内からテストを作成します。アセンブリの生成。
  2. スクリプトフォルダー(通常はAssets/Scripts)に移動し、右クリック->Create Assembly definitionこれにより、そこにAssemblyファイルも作成されます。
  3. テストに移動してくださいUnityのアセンブリ情報および参照を追加また、Editorプラットフォームに対してのみマークされていることを確認してください。

設定しました。テストはUnityで表示および実行できる必要があり、他のスクリプトを参照できます。


ルートフォルダー内のすべての.csprojおよび.slnファイルを削除しても安全であり、Unityはそれらを再作成することに注意してください(ソース管理上にあるべきではありません)。

そのため、そのような変更を行うためのテストは常に

  1. フォルダー内のVisual Studio関連ファイルを削除します。
  2. Assets-> Open C#projectを選択します。それをやらせてください。
  3. すべてがコンパイルおよび実行され、テストが同様に実行される場合、うまくセットアップできています。

ボーナス:Assets/DebugScenes/DebugScriptsにあるいくつかのデバッグプロジェクトもプロジェクトにあります。それらのために個別のアセンブリを作成し、実際のスクリプトアセンブリ(必要な場合)を参照させ、Editorプラットフォームとしてマークすることにより、これらのスクリプトがビルドなしでビルドに含まれないようにしますビルド中の追加手順。


余分な読書。一部のスクリプトのみをテストするため、すべてのスクリプトのアセンブリを作成したくないと考えるかもしれません。また、サブフォルダーのアセンブリを作成できるのは事実ですが、実際のスクリプトアセンブリから別のスクリプトへの参照を作成する必要があるため、これは問題を引き起こします。だから、すべてがきちんと整頓されており、理にかなっていることを確認してください...


Our test and real script Assembly infos side-by-side. Game Title has Planetary in it

7