Version: 6000.3
语言: 中文
4. 自定义对比
6. 设置和拆卸

5. 断言和期望日志

学习目标

如何测试和验证写入控制台日志的代码。

介绍和动机

在 Unity,我们有许多包和模块,它们通过将消息和异常记录到控制台日志中来与用户通信。这既可以适用于正常工作流,也可以适用于错误情况。

我们扩展了测试框架,以了解控制台日志。这意味着默认情况下,运行测试时记录的任何错误或异常都将导致该测试失败。如果预计会出现此类故障,则可以使用LogAssert.Expect(logtype, message)以确保记录给定消息。这也可用于预期正常消息和警告。这LogAssert.Expect可以在消息发生之前和之后放置。测试完成后(或下次测试时),如果预期消息不存在,它将失败。

[Test]
public void LogAssertExample()
{
 // Expect a regular log message
 LogAssert.Expect(LogType.Log, "Log message");

 // The test fails without the following expected log message
 Debug.Log("Log message");

 // An error log
 Debug.LogError("Error message");

 // Without expecting an error log, the test would fail
 LogAssert.Expect(LogType.Error, "Error message");
}

LogAssert.Expect也将正则表达式作为参数,因为有时不可能知道精确的字符串。例如,如果记录的消息在字符串中具有持续时间。

锻炼

示例 5_AssertingLogs有一个叫做MyLoggingClass.

该类有两个方法,具有以下行为:

  • DoSomething();记录消息“正在做某事”。

  • DoSomethingElse();记录错误“发生错误。代码:#“,其中 # 是 0 到 9 之间的随机数。

编写测试来验证上述行为,使用LogAssert.Expect.您可以通过看看如果DoSomethingElse();在没有期望的情况下调用,如果您期望会发生什么,例如警告类型的消息。

提示

  • 您需要将正则表达式与LogAssert.Expect以预期错误消息。
  • 在 Unity 中,记录的错误和记录的异常之间存在差异。

溶液

可以在示例中找到练习的完整解决方案5_AssertingLogs_Solution.

测试的一种可能实现如下:

[Test]
public void DoSomethingLogsMessage()
{
 var loggingClassUnderTest = new MyLoggingClass();
 
 loggingClassUnderTest.DoSomething();
 
 LogAssert.Expect(LogType.Log, "Doing something");
}

[Test]
public void DoSomethingElseLogsError()
{
 var loggingClassUnderTest = new MyLoggingClass();
 
 loggingClassUnderTest.DoSomethingElse();
 
 LogAssert.Expect(LogType.Error, new Regex("An error happened. Code: \\d"));
}

其他资源

API 参考LogAssert

4. 自定义对比
6. 设置和拆卸