代码之家  ›  专栏  ›  技术社区  ›  HAL9000

如何在Unity中设置单元测试并修复缺少的程序集引用错误?

  •  54
  • HAL9000  · 技术社区  · 8 年前

    我创建了以下结构:

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

    现在,当我在Unity中的Test Runner窗口中单击Run All时,出现以下错误:

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

    在Visual Studio中,我有两个项目:

    • 组件CSharp(包含src)

    • 测试(包含测试)

    我在第二个项目中添加了Assembly CSharp作为参考。Visual Studio能够生成无错误的解决方案。

    有人知道如何为Unity项目正确设置UnitTest回归吗?

    这是测试。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;
        }
    }
    

    我的例子。cs公司

    namespace abc
    {
        public class Example
        {
    
    
        }
    }
    
    3 回复  |  直到 8 年前
        1
  •  56
  •   sonnyb Programmer    7 年前

    尝试使用内置测试运行器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 project中手动执行任何操作。

    请注意,当我的程序集文件设置为“任意平台”时,如下所示(如您的问题所示):

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

    我的测试不会显示在测试运行程序窗口中。

    当我的程序集文件显式设置为仅包含“编辑器”平台时(根据我前面的示例),我的测试将正确显示在测试运行器窗口中。

    (我觉得这种行为有点违反直觉。)


    您还需要为脚本设置程序集定义。在您的 Scripts ,文件夹,创建部件定义文件 MyScriptAssembly.asmdef (使用Unity菜单 Assets -> Create -> Assembly Definition 或手动):

    {
        "name": "MyScriptAssembly"
    }
    

    然后,确保 测试。asmdef 引用脚本程序集:

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

    也可以在Unity Editor检查器窗口中进行设置。选择时,请参阅检查器中的“参考”。asmdef文件:

    assembly definition inspector window

    (有关更多详细信息,请参阅 Unity's documentation on assembly definition files )

        2
  •  18
  •   Thanasis Kapelonis    7 年前

    最终找到了正确的解决方案。一切都是通过编辑器完成的。

    因此,我们的目标是让测试程序集引用真实的代码程序集。为了做到这一点,你需要 定义 然后统一设置引用。

    1. 像往常一样从Unity内部创建测试。随着部件的生成。
    2. 转到脚本文件夹(通常是资产/脚本),然后右键单击-> 创建部件定义 这也将在其中创建一个部件文件。
    3. 转到测试程序集信息 团结一致 添加引用 并确保它仅标记为 编辑 站台

    你准备好了。您的测试应该在Unity中可见并可运行,并且它们可以引用任何其他脚本。


    请记住,您可以安全地删除所有内容。csproj和。根文件夹中的sln文件和Unity将重新创建它们(它们也不应在源代码管理上)。

    因此,对于这样的更改,您的测试应该始终是

    1. 删除文件夹中任何与visual studio相关的文件。
    2. 选择 资产->打开C#项目 .让它做自己的事吧。
    3. 如果一切都编译并运行了,并且您的测试也运行得很好,那么您就可以很好地进行设置了。

    奖励:我们的项目中还有几个调试项目,它们位于 资源/调试场景/调试脚本 。通过为它们创建单独的程序集,并使其引用真实的脚本程序集(如果需要),并将其标记为 编辑 平台我们确保在构建过程中,如果没有任何额外步骤,这些脚本永远不会包含在我们的构建中。


    额外阅读。您可能认为您不想为所有脚本创建程序集,因为您只想测试其中的一些脚本。确实可以为子文件夹创建程序集,但这会给您带来麻烦,因为您必须创建从一个真实脚本程序集到另一个真实脚本程序集的引用。所以,确保一切都是好的,整洁的,有意义的。。。


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

        3
  •  7
  •   Andrew Łukasik    5 年前

    Lite,“零组件”,替代设置:

    Assets
    ├── Scenes
    ├── Scripts
    │   └── MyGameScript.cs
    ├── Editor
    │   └── MyGameScriptTests.cs
    

    里面的所有脚本 Editor 目录可以引用 NUnit.Framework 命名空间和这些测试将显示在 Test Runner

    它的主要优点是简单。我肯定有些地方存在缺陷,但对于日常项目来说,这是一件好事;无需麻烦即可设置,只需工作即可。