在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等?
通常您需要端到端测试以及单元测试。我不想解释基本概念,但我只想根据自己的经验列出一些最佳实践。
为了进行单元测试,一次只测试一个层,方法是模拟它所基于的层。例如,当您测试业务层时,您应该模拟数据访问层。通过模拟下面的层,您可以在不接触其他层的情况下从逻辑上隔离要测试的代码存根。这种方法不仅易于使用,而且可以防止测试过多的东西并产生错误警报。您还可以准备测试夹具,以确保每次运行测试时,您都实际执行dry run
。
这里有一些流行的技术,你可以用来做单元测试:
- 要在视图层中测试Javascipt,可以使用Jasmine等
- 要测试C#代码,可以使用MSTest、UnUnit和xUnit
- 要模拟C#层,可以使用Moq
- 要进行端到端测试,可以使用Selenium
我们都知道,单元测试意味着一次测试单个场景。您必须为所有层编写单元测试。例如,在您的情况下,在MVC PlaceOrder
方法中,您的测试用例可以是:CheckForSufficientStock
输入参数是否为null,或者Verify
每个函数都被称为TimesOnce
。类似地,在其他层中,说
CheckForSufficientStock(int something)
{
...
}
同样的事情也会发生,如果再次调用任何函数,则验证次数,返回值。Mocking
需要跳过对其他层或函数的实际调用,方法是用返回值伪造它,这是进入下一行代码所必需的。我发现Moq
最适合初学者使用。