在.NET中是否可以在子进程中执行方法(委托,静态方法等)? System.Diagnostics.Process
似乎需要一个实际的文件名,这意味着需要单独的可执行文件。
我要做的是在单元测试中验证在进程退出时是否清理了OS资源。我知道可以使用CodeDOM或IL生成来创建这样的程序集并执行它,但单元测试的重点是隔离组件,而不是创建复杂性。出于同样的原因,我想完全避免单独的集会。
理想情况下,我会做类似的事情:
public static void CreateCounter()
{
var counter = new PerformanceCounter("category", "counter", "instance");
counter.InstanceLifetime = PerformanceCounterInstanceLifetime.Process;
}
[Test]
public void TestResourceDisposal()
{
// Start child process to execute CreateCounter()
...
// verify the resource is disposed
}
答案 0 :(得分:6)
首先,不,没有办法做到这一点。我处理意味着.exe。这不是Unix,您可以在其中分叉一个父进制副本的进程。
我只是创建一个小的.exe来运行。您是否需要使用不同的性能计数器运行测试?如果它适用于一个,那么肯定它可以与它们中的任何一个一起工作吗?
答案 1 :(得分:2)
你所说的不是单元测试。与实际(昂贵的)操作系统服务交互违反了单元测试旨在争取的基本隔离原则。
如果您的目的是以更端对端的方式测试代码,实际与性能计数器等进行交互,那么这将是集成测试,应该用更“重型”的方式,即根据需要编写单独的EXE,运行任何复杂的设置或清理步骤等。
如果需要对处理性能计数器的组件进行单元测试,则必须先将此依赖关系抽象出去。通常,您将创建表示性能计数器表面区域的基类或接口,然后创建某种类型的test double以替换(test)运行时的功能。真正的系统将使用一个简单的包装器,该包装器委托给实际的性能计数器,并且将通过上面的集成测试来执行。
通过阅读上面的评论,几乎听起来你正试图测试.NET框架的保证。我会怀疑这是否真的有必要,因为它已经经过了很好的测试,尽管你可能想测试你的代码是否正确使用它(在这种情况下你可以根据你正在寻求的验证进行单元测试或集成测试)。
答案 2 :(得分:0)
我不确定你要完成什么,但是从CreateCounter返回性能计数器实例并使用using指令会更容易,因为PerformanceCounter是IDisposable。像这样:
using (var counter = CreateCounter())
{
// Do some work
}
然后,即使你在测试期间扔掉,计数器也会一直被清理干净。
否则,我认为你想要的是create a new thread。然后你可以使用thread.Join()来等待线程完成。有关详细信息,请参阅System.Threading namespace。