C# 如何为大型项目创建集成测试

C# 如何为大型项目创建集成测试,c#,integration-testing,C#,Integration Testing,我们已经在c#中创建了P2P共享,我想进行一些集成测试,例如测试文件是否从发送方正确下载,并检查大小、速度等 我已尝试发送一个文件,然后进行了检查,但如果不运行该程序,我无法检查此文件 知道如何创建一些测试来检查数据吗?让我们从集成到单元测试的差异开始。而在单元测试中,您将单独测试各个部分(通常通过模拟依赖项来实现),集成测试针对更广泛(或完整)的系统 我假设您希望以自动化方式运行集成测试。基本上,您可以使用已经使用的单元测试框架(例如NUnit)运行测试,并且在创建必要的服务时,您不使用任何模

我们已经在c#中创建了P2P共享,我想进行一些集成测试,例如测试文件是否从发送方正确下载,并检查大小、速度等

我已尝试发送一个文件,然后进行了检查,但如果不运行该程序,我无法检查此文件


知道如何创建一些测试来检查数据吗?

让我们从集成到单元测试的差异开始。而在单元测试中,您将单独测试各个部分(通常通过模拟依赖项来实现),集成测试针对更广泛(或完整)的系统

我假设您希望以自动化方式运行集成测试。基本上,您可以使用已经使用的单元测试框架(例如NUnit)运行测试,并且在创建必要的服务时,您不使用任何模拟,而是注入实际的依赖项

如何准确地设置集成测试的“框架”取决于您的项目,例如,如果您使用IoC库来注入依赖项,那么您可能也可以在集成测试中使用此库,而不必手动设置服务

您需要注意的是,当您运行集成测试时,它可能会影响正在运行它的系统。因此,如果您在文件系统上执行某些操作,最好确保在测试后进行清理。
我建议创建一些适合您的项目的基本“框架”来设置集成测试,其中包括设置要与您的系统一起运行的测试所需的通用代码,并可能在临时目录中创建专用文件夹,这些文件夹将在每次测试运行后删除

现在来回答你更具体的问题:如果我没弄错的话,你需要创建一个“发送者”来提供你想要下载的测试文件。作为测试的一部分,您可以将此测试文件部署到上述临时文件夹,并配置发送方以提供该文件。然后,您可以创建与此发件人交互的客户端,并将文件下载到系统上的某个位置

在您开始下载之前,您可以跟踪时间并计算出需要多长时间。此外,您可以在下载完成后检查其属性,或者将其与原始文件进行比较,因为我认为它应该是相同的

下面是一些可以显示一般概念的伪代码:

[TestMethod]
[TestCategory("Integration")
public void DownloadFileFromSender_ConnectionDoesNotGetInterrupted_SuccessfullyDownloadsFile()
{
   // Arrange - do the setup of files and temp folders, make create sender and receiver
   SetupTestFile(@"Tempfolder\Testfile.txt");
   var sender = new Sender(...);
   var receiver = new Receiver(...);

   sender.ProvideFile(@"Tempfolder\Testfile.txt");

   // Act - Put your actual test here
   var timeBeforeDownload = DateTime.Now;
   receiver.DownloadFile(sender, @"Tempfolder\Testfile.txt", @"Tempfolder\DownloadedFile.txt");
   var totalDownloadTime = DateTime.Now - timeBeforeDownload;

   // Assert - Verify here your assumptions, e.g. download time or file properties
   Assert.IsTrue(totalDownloadTime.TotalMilliseconds < 10000);
   Assert.IsTrue(File.Exists(@"Tempfolder\DownloadedFile.txt"));
}
[TestMethod]
[测试类别(“集成”)
public void从发件人下载文件\u连接未中断\u成功下载文件()
{
//安排-设置文件和临时文件夹,创建发送方和接收方
SetupTestFile(@“Tempfolder\Testfile.txt”);
var发送方=新发送方(…);
var接收器=新接收器(…);
sender.ProvideFile(@“Tempfolder\Testfile.txt”);
//行动-把你的实际测试放在这里
var timeBeforeDownload=DateTime.Now;
receiver.DownloadFile(发送方,@“Tempfolder\Testfile.txt”,@“Tempfolder\downloaddedfile.txt”);
var totalDownloadTime=DateTime.Now-timeBeforeDownload;
//断言-在此验证您的假设,例如下载时间或文件属性
Assert.IsTrue(totalDownloadTime.total毫秒<10000);
Assert.IsTrue(File.Exists(@“Tempfolder\DownloadedFile.txt”);
}
请注意,根据您正在测试的部件的大小/复杂性,运行集成测试可能需要更长的设置和运行时间。它们不会取代单元测试,而是对单元测试进行补充。由于它们之间的差异,最好将它们标记为可以运行单元测试或集成测试


同样,关于如何设置测试环境的细节取决于您自己,并且在很大程度上取决于您想要测试的项目。

谢谢您的回答。但是还有一个关于发送方的问题。我是否应该在创建假发送方和客户机时使用与发送方相同的功能?是的,集成测试的目标是验证功能实际代码的不确定性,因此您可能希望使用(分别测试)生产代码。在某些情况下,您可能需要为测试设置特定的内容,其中您可能需要一些特殊的配置或参数,但理想情况下,您将使用完全相同的类,并且只返回到某些“测试特定的配置”如果所有其他方法都失败。没问题,如果它回答了您的问题,请随意将其标记为接受答案:-)