Writing Automated Unit Tests and Integration Tests
当你使用DI正确编写低耦合的代码,非常容易隔离指定区域的代码,基本意图是运行测试,
在不需要启动你项目的前提下;这些可以从用户派生的测试框架或者使用NUnit自动化测试;
自动化测试对于持续和服务器交互特别有帮助;这允许你自动运行测试无论何时有新的提交到版本控制;
有三种基本的测试帮助类包含在Zenject里面,可以更容易的编写自动化测试游戏;
第一个是Unit Tests,另外一个是交互测试,第三个是场景测试;
所有的方法通过Unity内置的Test Runner来运行(也有一个命令行接口你可以持续的和服务器进行测试);
最主要的不同是Unit Tests更小的范围意味着测试子集类,在应用里面,
交互测试可以更易夸张并且可以从很多不同的系统来触发;
场景测试一般用于触发进入场景并且校验场景状态作用测试的一部分
代码示例:
Unit Tests
using System;
public class Logger
{
public Logger()
{
Log = "";
}
public string Log
{
get;
private set;
}
public void Write(string value)
{
if (value == null)
{
throw new ArgumentException();
}
Log += value;
}
}
通过以下步骤来测试类:
- 点击
Window -> General -> Test Runner
来打开Unity的Test Runner - 在EditMode页签下面点击Create EditMode Test Assembly Folder;
这将创建一个文件夹,包含了必要的asmdef文件,
需要来访问NUnit命名空间 - 选择新创建的asmdef文件并且添加Zenject-TestFramework引用
- 右击Project页签选择
Create -> Zenject -> Unit Test
;命名为TestLogger.cs;创建一个空模板测试类 - 复制下面的代码:
using System;
using Zenject;
using NUnit.Framework;
[TestFixture]
public class TestLogger : ZenjectUnitTestFixture
{
[SetUp]
public void CommonInstall()
{
Container.Bind<Logger>().AsSingle();
}
[Test]
public void TestInitialValues()
{
var logger = Container.Resolve<Logger>();
Assert.That(logger.Log == "");
}
[Test]
public void TestFirstEntry()
{
var logger = Container.Resolve<Logger>();
logger.Write("foo");
Assert.That(logger.Log == "foo");
}
[Test]
public void TestAppend()
{
var logger = Container.Resolve<Logger>();
logger.Write("foo");
logger.Write("bar");
Assert.That(logger.Log