在n层应用程序中应该测试哪一层

本文关键字:一层 测试 应用程序 | 更新日期: 2023-09-27 18:25:49

我有一个4层应用程序

1) 演示(MVC)
2) 服务(WCF)
3) 业务
4) 数据

我的服务层中的一些方法执行许多其他子过程,例如

public OrderResponse PlaceOrder(OrderRequest request)
{
     if (CheckForSufficientStock(request.ItemId)) {
          ReserveStock(request.ItemId);
          ProcessPayment(request.CustomerPaymentDetails);
          RemoveStockFromInventory(request.ItemId);
          ArrangeForShipping(request.CustomerDetails);
          AddToOrderHistory(request);          
     }
}

我开始学习如何编写单元测试,我有几个问题

1) 我应该为哪一层编写单元测试?我是否在MVC项目中为控制器编写单元测试?还是必须为服务层中的每个方法编写单元测试?还是两者兼而有之?

2) 如果我必须为MVC&服务层,我说得对吗,我的MVC项目中的单元测试将测试PlaceOrder,而测试我的服务层的单元测试则将测试所有子功能,例如ReserveStock、ProcessPayment等?

在n层应用程序中应该测试哪一层

通常您需要端到端测试以及单元测试。我不想解释基本概念,但我只想根据自己的经验列出一些最佳实践。

为了进行单元测试,一次只测试一个层,方法是模拟它所基于的层。例如,当您测试业务层时,您应该模拟数据访问层。通过模拟下面的层,您可以在不接触其他层的情况下从逻辑上隔离要测试的代码存根。这种方法不仅易于使用,而且可以防止测试过多的东西并产生错误警报。您还可以准备测试夹具,以确保每次运行测试时,您都实际执行dry run

这里有一些流行的技术,你可以用来做单元测试:

  • 要在视图层中测试Javascipt,可以使用Jasmine
  • 要测试C#代码,可以使用MSTestUnUnitxUnit
  • 要模拟C#层,可以使用Moq
  • 要进行端到端测试,可以使用Selenium

我们都知道,单元测试意味着一次测试单个场景。您必须为所有层编写单元测试。例如,在您的情况下,在MVC PlaceOrder方法中,您的测试用例可以是:CheckForSufficientStock输入参数是否为null,或者Verify每个函数都被称为TimesOnce。类似地,在其他层中,说

CheckForSufficientStock(int something)
{
...
}

同样的事情也会发生,如果再次调用任何函数,则验证次数,返回值。Mocking需要跳过对其他层或函数的实际调用,方法是用返回值伪造它,这是进入下一行代码所必需的。我发现Moq最适合初学者使用。