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有关程序集定义文件的文档)
And*_*sik 15
Lite,“零组件”,替代设置:
\nAssets\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最终找到了正确的解决方案。一切都通过编辑器完成。
因此,我们的目标是让测试程序集引用真实代码程序集。为此,您需要定义两个程序集,然后统一设置引用。
你定了 您的测试应该在Unity中可见并且可以运行,并且它们可以引用任何其他脚本。
请记住,您可以安全删除根文件夹中的所有.csproj和.sln文件,Unity会重新创建它们(也不应将它们放在源代码控制中)。
因此,进行此类更改的测试应该始终是
奖励:我们的项目中还有两个调试项目,分别位于Assets / DebugScenes / DebugScripts中。通过为它们创建一个单独的程序集,并使其引用真实的脚本程序集(如果需要),并将其标记为Editor平台,我们可以确保在构建过程中,如果没有任何额外的步骤,这些脚本就不会包含在我们的构建中。
额外阅读。您可能会认为您不想为所有脚本创建程序集,因为您只想测试其中一些脚本。确实可以为子文件夹创建程序集,但这会给您带来麻烦,因为您必须创建从一个实际脚本程序集到另一个真实脚本程序集的引用。因此,请确保一切都很好,整洁并有意义。