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

HAL*_*000 26 c# unit-testing unity-game-engine

我创建了以下结构:

??? Assets
??? Scenes
??? Scripts
?   ??? MyExample.cs
??? Tests
?   ??? MyExampleTest.cs
?   ??? Tests.asmdef
Run Code Online (Sandbox Code Playgroud)

现在,当我单击Run Run,在Test Runner窗口中,在Unity中,我有以下错误:

The type or namespace name `MyExample' could not be found. Are you missing an assembly reference?
Run Code Online (Sandbox Code Playgroud)

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

  • Assembly-CSharp(包含src)

  • 测试(包含测试)

我在第二个项目中添加了Assembly-CSharp作为参考.Visual Studio能够构建没有错误的解决方案.

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

这是Tests.asmdef

{
    "name": "Tests",
    "optionalUnityReferences": [
        "TestAssemblies"
    ]
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

MyExample.cs

namespace abc
{
    public class Example
    {


    }
}
Run Code Online (Sandbox Code Playgroud)

son*_*nny 34

尝试使用内置的Test Runner UI设置Test Assembly文件夹和第一个Test脚本.

使用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"
    ]
}
Run Code Online (Sandbox Code Playgroud)

您不必在Visual Studio项目中手动执行任何操作以设置测试.

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

{
    "name": "Tests",
    "optionalUnityReferences": [
        "TestAssemblies"
    ]
}
Run Code Online (Sandbox Code Playgroud)

我的测试没有出现在Test Runner窗口中.

当我的程序集文件显式设置为仅包含"编辑器"平台时(根据我之前的示例),我的测试在Test Runner窗口中正确显示.

(这种行为对我来说似乎有点违反直觉.)


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

{
    "name": "MyScriptAssembly"
}
Run Code Online (Sandbox Code Playgroud)

然后,确保您Tests.asmdef的脚本汇编参考:

{
    "name": "Tests",
    "references": [
        "MyScriptAssembly"
    ],
    "optionalUnityReferences": [
        "TestAssemblies"
    ],
    "includePlatforms": [
        "Editor"
    ],
    "excludePlatforms": [],
    "allowUnsafeCode": false
}
Run Code Online (Sandbox Code Playgroud)

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

装配定义检查器窗口

(有关更多详细信息,请参阅Unity有关程序集定义文件的文档)

  • 谢谢你的回答! (3认同)
  • 我有一些其他奇怪的错误.我按照你的建议重新创建了这个项目,最后,它正在工作.我真的很感谢你:)问题在于缺少装配定义. (2认同)
  • 这为我解决了,谢谢! (2认同)

And*_*sik 15

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

\n
Assets\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Scenes\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Scripts\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 MyGameScript.cs\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Editor\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 MyGameScriptTests.cs\n
Run Code Online (Sandbox Code Playgroud)\n

目录中的所有脚本都Editor可以引用NUnit.Framework名称空间,这些测试将显示在Test Runner窗口中。

\n

它的主要优点是简单。我确信某些地方存在缺点,但对于日常项目来说,这是一件幸事;设置起来零麻烦,正常工作。

\n

  • 哦,射击!是的,这很好用。我的一个抱怨是,你似乎无法运行 PlayMode 测试,这是一个令人沮丧的缺点。 (4认同)
  • @ŠtefanSchindler 幸运的是,“编辑器”目录脚本被排除在构建之外。 (3认同)

Tha*_*nis 7

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

因此,我们的目标是让测试程序集引用真实代码程序集。为此,您需要定义两个程序集,然后统一设置引用。

  1. 照常从Unity内部创建测试。随着装配的产生。
  2. 转到脚本文件夹(通常是Assets / Scripts),然后右键单击-> 创建部件定义,这也会在其中创建部件文件。
  3. 在Unity中转到您的测试程序集信息添加对实际程序集的引用,并确保仅将其标记为Editor平台。

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


请记住,您可以安全删除根文件夹中的所有.csproj和.sln文件,Unity会重新创建它们(也不应将它们放在源代码控制中)。

因此,进行此类更改的测试应该始终是

  1. 删除文件夹中任何与Visual Studio相关的文件。
  2. 选择Assets-> Open C#project。让它做自己的事。
  3. 如果一切都能编译并运行,并且您的测试也是如此,那么您就可以很好地进行设置。

奖励:我们的项目中还有两个调试项目,分别位于Assets / DebugScenes / DebugScripts中。通过为它们创建一个单独的程序集,并使其引用真实的脚本程序集(如果需要),并将其标记为Editor平台,我们可以确保在构建过程中,如果没有任何额外的步骤,这些脚本就不会包含在我们的构建中。


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


我们的测试和真实脚本汇编信息并排。 游戏标题中包含行星