我是单元测试的新手。我有一个使用 asp.net mvc3 和 s#arp lite 的 Web 应用程序。我想向这个应用程序添加单元测试。到目前为止,我对控制器类中的每个操作都进行了测试。只是好奇,我还需要测试什么?视图是否也需要测试?
另一个问题,我在网上找到的所有测试示例都是使用起订量或其他工具来制作假数据。我们是否还应该再次测试真实数据库?
我是单元测试的新手。我有一个使用 asp.net mvc3 和 s#arp lite 的 Web 应用程序。我想向这个应用程序添加单元测试。到目前为止,我对控制器类中的每个操作都进行了测试。只是好奇,我还需要测试什么?视图是否也需要测试?
另一个问题,我在网上找到的所有测试示例都是使用起订量或其他工具来制作假数据。我们是否还应该再次测试真实数据库?
您既不应该对视图进行单元测试,也不应该针对真实数据库进行单元测试。对代码级工件使用单元测试,例如控制器操作、操作过滤器、html 帮助程序、模型以及用 C# 编写的任何内容。
要测试真实的数据库和视图,请查看集成测试。集成测试不像单元测试,但你仍然可以使用像 nunit 这样的单元测试框架来执行它们。基本上,您只需编写测试代码来使用 Selenium WebDriver 或 Watin 之类的东西来驱动浏览器。但这些并不是真正的单元测试,它们是集成测试、端到端测试或用户验收测试。
“测试直到无聊”
话虽如此,请注意不要通过集成测试进行大部分测试。换句话说,一次测试一件事。例如。你可能对测试感兴趣
但不要在同一个测试中测试 2 个或更多。因此,如果您测试控制器逻辑,请传入或模拟出正在使用的数据对象。
话虽如此,您可能还对“如何”测试这些部分感兴趣。我将在下面介绍 3 个部分(数据库、加载函数、视图)
数据库
实际上只有两件事你需要在数据库中测试
对于连接,我更喜欢回声测试
Assert.AreEqual(42, QuerySingleResult("Select 42"));
测试数据库元数据的方法有很多种,但如果您存储了版本号,您可以简单地测试它。这也使升级路径更容易。
Assert.AreEqual(6, QuerySingleResult("Select version From Schema"));
加载函数
有很多方法可以测试加载函数(我将在这里展示一个简单的方法),但它们都依赖于将加载隔离到一个函数中。
测试 linq 到...假设你有
var people = From db in new EntityFrameworkContext().People Where ...... Select ....
如果你把它分成两个函数
IEnumerable<People> LoadPeople()
{
return LoadPeople( new EntityFrameworkContext().People);
}
IEnumerable<People> LoadPeople(IEnumerable<People> fromPeople)
{
return From db in fromPeople Where ...... Select ....
}
这现在很容易测试。
意见
虽然视图很容易测试,但有很多细节。我会向您推荐所有视频:http ://www.youtube.com/watch?v=SttlPzwJw3U
但两个重要的部分是
1) 测试
MvcApprovals.VerifyMvcPage(new YourController().YourTestAction
2) 控制器中的测试接缝
public ActionResult YourTestAction()
{
// setup your model
return View("viewpage", model);
}
快乐测试!
测试任何可能包含错误的东西。视图有点难以测试,但这不是一个坏主意。如果您正在寻找细节,请测试任何自定义属性、事件、静态方法、扩展方法以及任何其他实用程序。
如果您要针对数据库进行测试,请确保它是专用于测试的数据库。许多 ORM 还为您提供了一种模拟数据库的方法。
我个人是 Ayehde (www.ayende.com) 产品的粉丝,并分别使用 Rhino.Mocks 和 RavenDB 作为我的模拟框架和数据库。
如果视图中没有逻辑,则可能不需要对它们进行单元测试。您可能希望通过一些端到端测试来补充您的单元测试,这些测试涵盖了使用 Selenium 等重要的基本场景。
是的,您希望与单元测试一起进入数据库的集成测试。
根据定义,我们无法告诉您要单元测试什么,因为您正在测试您的代码,而不是框架代码。而且我们不知道您的代码是做什么的。只有你这样做。
单元测试框架代码没有意义,它已经被测试过了。您需要专注于编写涵盖您的逻辑的测试。