gpt4 book ai didi

c# - 在同一解决方案中针对服务器运行集成测试

转载 作者:行者123 更新时间:2023-11-30 15:22:52 24 4
gpt4 key购买 nike

我使用 NUnit/MSTest 编写集成测试,只是因为它更容易。测试需要与同一解决方案中的 TCP 服务器通信,并且它希望同时调试测试和 TCP 服务器。有没有办法在 Debug模式下从解决方案启动项目(控制台应用程序)并同时调试测试方法?无论我尝试过什么,VS 都不允许。

最佳答案

这是编写集成测试时的常见场景。集成测试依赖于另一个服务的启动和运行。为了处理它,我通常调用进程来启动,例如同一解决方案中的 ConsoleApplication 项目。只需添加一个帮助程序类即可调用该流程。

internal class ProcessInvoker
{
/// <summary>
/// Invokes the host process for test service
/// </summary>
public static void InvokeDummyService()
{
var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

ProcessStartInfo info = new ProcessStartInfo(Path.Combine(path, "DummyService.exe"));

info.UseShellExecute = true;
info.WorkingDirectory = path;

var process = Process.Start(info);
}

/// <summary>
/// Kills the process of service host
/// </summary>
public static void KillDummyService()
{
Process.GetProcessesByName("DummyService").ToList().ForEach(x => x.Kill());
}
}

现在在 TestInitialize 和 TestCleanup 方法中,我将启动进程并终止相应的进程。

    /// <summary>
/// Setup required before the tests of the fixture will run.
/// </summary>
[TestFixtureSetUp]
public void Init()
{
ProcessInvoker.InvokeDummyService();
}

/// <summary>
/// Tear down to perform clean when the execution is finished.
/// </summary>
[TestFixtureTearDown]
public void TearDown()
{
ProcessInvoker.KillDummyService();
}

现在,来附加此过程以进行调试的部分。这是一个非常棘手的问题。我找到了一个 VS Addin从 Visual Studio 团队自动附加子进程到当前调试器,但它似乎只适用于“f5”调试。

然后我找到this SO post它真的很有效。我在此处发布了完整的代码形式的答案,几乎没有定制:

using System;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using System.Linq;
using System.Collections.Generic;
using EnvDTE;

namespace Common
{

[ComImport, Guid("00000016-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IOleMessageFilter
{
[PreserveSig]
int HandleInComingCall(int dwCallType, IntPtr hTaskCaller, int dwTickCount, IntPtr lpInterfaceInfo);

[PreserveSig]
int RetryRejectedCall(IntPtr hTaskCallee, int dwTickCount, int dwRejectType);

[PreserveSig]
int MessagePending(IntPtr hTaskCallee, int dwTickCount, int dwPendingType);
}

public class MessageFilter : IOleMessageFilter
{
private const int Handled = 0, RetryAllowed = 2, Retry = 99, Cancel = -1, WaitAndDispatch = 2;

int IOleMessageFilter.HandleInComingCall(int dwCallType, IntPtr hTaskCaller, int dwTickCount, IntPtr lpInterfaceInfo)
{
return Handled;
}

int IOleMessageFilter.RetryRejectedCall(IntPtr hTaskCallee, int dwTickCount, int dwRejectType)
{
return dwRejectType == RetryAllowed ? Retry : Cancel;
}

int IOleMessageFilter.MessagePending(IntPtr hTaskCallee, int dwTickCount, int dwPendingType)
{
return WaitAndDispatch;
}

public static void Register()
{
CoRegisterMessageFilter(new MessageFilter());
}

public static void Revoke()
{
CoRegisterMessageFilter(null);
}

private static void CoRegisterMessageFilter(IOleMessageFilter newFilter)
{
IOleMessageFilter oldFilter;
CoRegisterMessageFilter(newFilter, out oldFilter);
}

[DllImport("Ole32.dll")]
private static extern int CoRegisterMessageFilter(IOleMessageFilter newFilter, out IOleMessageFilter oldFilter);
}

public static class AttachDebugger
{
public static void ToProcess(int processId)
{
MessageFilter.Register();
var process = GetProcess(processId);
if (process != null)
{
process.Attach();
Console.WriteLine("Attached to {0}", process.Name);
}
MessageFilter.Revoke();
}
private static Process GetProcess(int processID)
{
var dte = (DTE)Marshal.GetActiveObject("VisualStudio.DTE.12.0");
var processes = dte.Debugger.LocalProcesses.OfType<Process>();
return processes.SingleOrDefault(x => x.ProcessID == processID);
}
}
}

注意:您需要从 AddReference -> Extentions 添加 VS 自动化库 EnvDTE

现在在 ProcessInvoker 类中,在进程启动语句之后添加对 AttachDebugger 实用程序类的调用。

var process = Process.Start(info);
// Add this after invoking process.
AttachDebugger.ToProcess(process.Id);

当我启动调试测试时,它非常有效。该进程被调用,附加到 VS 并且能够调试其他进程代码。

检查工作解决方案 here .特别WcfDynamicProxy.Tests在解决方案中。我在那里使用 Nunit 编写集成测试。

关于c# - 在同一解决方案中针对服务器运行集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35067214/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com