与测试相同的程序集中的 nUnit 扩展
nUnit extension in the same assembly as tests
History: nUnit 3. 我有复杂继承的测试。在 SetUp
或 OneTimeSetUp
内创建了某个对象。这些方法是虚拟的。当此对象未关闭时,会发生泄漏。
问题:对象在TearDown
或OneTimeTearDown
中被销毁,但仅在SetUp
或[=12=时调用】 成功。因此,当 TearDown
或 OneTimeTearDown
中某处发生异常时,就会发生泄漏。正如我提到的,有多个继承级别,因此异常和关键对象的创建可能发生在不同的 classes 中,在不同的堆栈帧上。
我想做什么:我想要ITestEventListener
在初始化完成之前对失败做出反应并清理关键对象。
我尝试了什么:在我的测试程序集中我创建了class:
namespace My.Whatever.Tests.Web.Util
{
[Extension(EngineVersion = "3.4")]
public class NunitEventListener : ITestEventListener
{
public void OnTestEvent(string report)
{
Debug.WriteLine(report);
}
}
}
然后我通过
尝试了 运行 测试
- VS(nunit 3 测试适配器)
- n单元控制台
None 似乎加载了扩展程序。
问题:我做错了什么?
信息来源:https://github.com/nunit/docs/wiki/Event-Listeners , https://github.com/nunit/docs/wiki/Writing-Engine-Extensions
有关扩展位置的信息可在 https://github.com/nunit/docs/wiki/Engine-Extensibility#locating-addins 中找到,该链接来自您提到的两个参考文献中的第二个。
未在您的测试程序集中搜索扩展。我们在 V2 中为 NUnit Addins 提供了它作为测试扩展的简单方法,但是对于引擎扩展来说这样做有点复杂。在我看来,如果我们能让它工作,那将是一个很好的功能,但它涉及使所有扩展都能够加载和卸载,因为新的测试程序集是 运行。这是我们扩展服务的重大内部变化。
在包含引擎组件的目录中,您可能会找到一个或多个 .addins
类型的文件。是否有,有多少以及它们包含什么取决于您如何安装 运行ner 和引擎。该文件的条目指向为该特定引擎副本安装的扩展。详情见上面的参考页。
在两种情况下,由于 .addins
文件中存在通配符条目,扩展的位置或多或少是自动的:
如果您使用 NuGet 安装控制台 运行ner,则会找到作为 nuget 包安装的任何扩展。
如果您使用 Chocolatey 安装控制台 运行ner,将找到由 chocolatey 安装的任何扩展。
在所有其他情况下,恐怕您必须手动编辑 .addins
文件。
在适配器的特定情况下,没有 .addins
文件,因此不会加载任何扩展。理论上,您可以手动创建这样的文件并加载您的扩展,至少如果引擎安装在您有权访问的目录中。如果您使用的是 nuget 包,情况就是如此。我建议您先尝试在控制台下识别您的扩展程序 运行ner,然后再尝试,因为这会涉及额外的复杂性。
顺便说一句,并非所有第三方 运行 用户都使用该引擎。如果他们根本不使用引擎,当然不可能提供扩展。
更新:我只注意到你说 TearDown
和 OneTimeTearDown
只有 运行 当 SetUp or
OneTimeSetUp` 成功时。那不是真实的陈述。两种拆解都只有运行如果对应的setup是运行,不管成功与否。当然,您的拆解必须考虑到相应的设置可能没有 运行 完成的事实,这可能很棘手。
History: nUnit 3. 我有复杂继承的测试。在 SetUp
或 OneTimeSetUp
内创建了某个对象。这些方法是虚拟的。当此对象未关闭时,会发生泄漏。
问题:对象在TearDown
或OneTimeTearDown
中被销毁,但仅在SetUp
或[=12=时调用】 成功。因此,当 TearDown
或 OneTimeTearDown
中某处发生异常时,就会发生泄漏。正如我提到的,有多个继承级别,因此异常和关键对象的创建可能发生在不同的 classes 中,在不同的堆栈帧上。
我想做什么:我想要ITestEventListener
在初始化完成之前对失败做出反应并清理关键对象。
我尝试了什么:在我的测试程序集中我创建了class:
namespace My.Whatever.Tests.Web.Util
{
[Extension(EngineVersion = "3.4")]
public class NunitEventListener : ITestEventListener
{
public void OnTestEvent(string report)
{
Debug.WriteLine(report);
}
}
}
然后我通过
尝试了 运行 测试- VS(nunit 3 测试适配器)
- n单元控制台
None 似乎加载了扩展程序。
问题:我做错了什么?
信息来源:https://github.com/nunit/docs/wiki/Event-Listeners , https://github.com/nunit/docs/wiki/Writing-Engine-Extensions
有关扩展位置的信息可在 https://github.com/nunit/docs/wiki/Engine-Extensibility#locating-addins 中找到,该链接来自您提到的两个参考文献中的第二个。
未在您的测试程序集中搜索扩展。我们在 V2 中为 NUnit Addins 提供了它作为测试扩展的简单方法,但是对于引擎扩展来说这样做有点复杂。在我看来,如果我们能让它工作,那将是一个很好的功能,但它涉及使所有扩展都能够加载和卸载,因为新的测试程序集是 运行。这是我们扩展服务的重大内部变化。
在包含引擎组件的目录中,您可能会找到一个或多个 .addins
类型的文件。是否有,有多少以及它们包含什么取决于您如何安装 运行ner 和引擎。该文件的条目指向为该特定引擎副本安装的扩展。详情见上面的参考页。
在两种情况下,由于 .addins
文件中存在通配符条目,扩展的位置或多或少是自动的:
如果您使用 NuGet 安装控制台 运行ner,则会找到作为 nuget 包安装的任何扩展。
如果您使用 Chocolatey 安装控制台 运行ner,将找到由 chocolatey 安装的任何扩展。
在所有其他情况下,恐怕您必须手动编辑 .addins
文件。
在适配器的特定情况下,没有 .addins
文件,因此不会加载任何扩展。理论上,您可以手动创建这样的文件并加载您的扩展,至少如果引擎安装在您有权访问的目录中。如果您使用的是 nuget 包,情况就是如此。我建议您先尝试在控制台下识别您的扩展程序 运行ner,然后再尝试,因为这会涉及额外的复杂性。
顺便说一句,并非所有第三方 运行 用户都使用该引擎。如果他们根本不使用引擎,当然不可能提供扩展。
更新:我只注意到你说 TearDown
和 OneTimeTearDown
只有 运行 当 SetUp or
OneTimeSetUp` 成功时。那不是真实的陈述。两种拆解都只有运行如果对应的setup是运行,不管成功与否。当然,您的拆解必须考虑到相应的设置可能没有 运行 完成的事实,这可能很棘手。