Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 每个单元应该测试多少?_Unit Testing_Testing_Tdd_Testing Strategies - Fatal编程技术网

Unit testing 每个单元应该测试多少?

Unit testing 每个单元应该测试多少?,unit-testing,testing,tdd,testing-strategies,Unit Testing,Testing,Tdd,Testing Strategies,我的每个单元测试应该检查多少?比如我有这个测试 [TestMethod] public void IndexReturnsAView() { IActivityRepository repository = GetPopulatedRepository(); ActivityController activityController = GetActivityController(repository); ActionResult result = activityCon

我的每个单元测试应该检查多少?比如我有这个测试

[TestMethod]
public void IndexReturnsAView()
{
    IActivityRepository repository = GetPopulatedRepository();
    ActivityController activityController = GetActivityController(repository);
    ActionResult result = activityController.Index();
    Assert.IsInstanceOfType(result, typeof(ViewResult));
}
而且

[TestMethod]
public void IndexReturnsAViewWithAListOfActivitiesInModelData()
{
    IActivityRepository repository = GetPopulatedRepository();
    ActivityController activityController = GetActivityController(repository);
    ViewResult result = activityController.Index() as ViewResult;
    Assert.IsInstanceOfType(result.ViewData.Model, typeof(List<Activity>));
}
[TestMethod]
public void IndexReturnsAViewWithAListOfActivitiesInModelData()的列表
{
IActivityRepository repository=GetPopulatedRepository();
ActivityController ActivityController=GetActivityController(存储库);
ViewResult=activityController.Index()作为ViewResult;
Assert.IsInstanceOfType(result.ViewData.Model,typeof(List));
}

显然,如果第一个测试失败,那么第二个测试也会失败,那么这两个测试是否应该合并为一个测试和两个断言?我的感觉是,测试的粒度越细,每次测试检查的次数越少,找到失败原因的速度就越快。但是,进行大量非常小的测试会带来开销,这可能会花费运行所有测试的时间

我建议尽可能地分解它们

原因有很多,其中最重要的是:

  • 当您的一个测试失败时,您希望能够尽可能快速、安全地准确地隔离出出错的地方。让每个测试方法只测试一件事是实现这一目标的最佳方式

  • 每次测试都需要从头开始。如果只创建一次存储库,然后在两个或多个测试中使用它,那么您对这些测试的顺序有一个隐式依赖关系。假设Test1向存储库添加了一个项目,但忘记删除它。Test2的行为现在将有所不同,并可能导致测试失败。唯一的例外是不可变数据

关于你的速度问题,我不担心。对于像这样的纯代码处理,.NET是非常快的,您永远无法分辨它们之间的区别。一旦您脱离了代码处理,进入数据库等领域,您就会感觉到性能问题,但一旦您这样做,您就会遇到上述所有“干净板岩”问题,因此您可能不得不接受它(或者让尽可能多的数据保持不变)


祝您测试顺利。

粒度越细越好。当测试用例中的断言失败时,测试用例将不再运行。案件的后一部分可能会发现其他错误


如果测试用例之间存在共享代码,请使用setup/teardown函数来处理这些代码,而不要重复太多。时间成本通常可以忽略不计。如果安装/拆卸花费太多时间,那么您可能不是在进行单元测试,而是在进行更高级别的自动化测试。理想情况下,单元测试不应该有文件系统、网络、数据库等依赖项。

单元测试应该从功能设计的角度准确地测试技术设计中描述的内容。

我认为“标准”答案是,如果代码中有错误,它应该破坏一个测试,但是,当此测试失败时,不要隐藏任何其他失败(不要停止其他测试的运行)。每个测试测试一件事,两个测试不测试同一件事。这是一个理想,并不总是可以实现的。称之为指导

尽管如此,这确实是一门艺术。最初我会把性能问题放在一边,更多地关注可维护性。这里有两行半到三行的复制品。如果设计发生变化,就很难维护。在这种情况下,复制本身可以通过类中的一个字段的设置方法来解决,但需要担心的主要问题是可维护性


测试应该足够小,便于维护,易于理解,并且能够让其他人(或您在时间流逝后)合理地理解代码在做什么,并能够维护测试。

关于测试量的方法肯定是您需要提前决定并坚持的。我不认为每个人都应该一致地遵循相同的方法,因为不同的团队和/或项目在编码、性能、故障排除、测试基础设施等方面有不同的优先级。但保持一致总是有帮助的:

  • 更快地发现问题,因为 你事先知道要挖多深
  • 花更少的时间来构建 你的测试
  • 使用同一套 测试助手类的 实施测试
  • 足够快地运行测试:不要太快也不要太慢
  • 组织测试(套件、包等)
  • 如果您认为性能更重要,那么可以使用更多的验证/资产来实施更厚的测试。如果您决定排除故障是最重要的,那么根据需要隔离测试。我不明白为什么厚而结构良好的测试是有缺陷的。这样的测试可以完成与大量更薄的测试相同的工作,而且效果也一样


    当然,每个测试仍然需要关注特定的功能/特性,但这并不是本文的主题。

    在我看来,这是一个过于笼统的答案。可能有两个断言必须在两个测试中进行测试,有些断言可能同时进行测试。您是如何知道的?就在你的头顶上?这是一个好方法吗?通常每个逻辑函数至少做两个断言,一个接受良好的输入并测试良好的输出,另一个放入垃圾输入并预期失败。但是,如果没有技术设计,你不知道好的输出应该是什么,如果没有功能设计,你不知道应该保护哪些范围的垃圾输入。你对他的问题的回答是,“你应该准确地测试你的开发主管告诉你要测试的内容”,虽然这在某个层面上可能是正确的,当问题是请求对某些特定代码的反馈时,这是完全没有帮助的。事实上,你测试的是你的功能到底是什么,该功能不是由首席开发人员描述的,而是由想要该应用程序的人描述的。我确实打算编写slate,但状态也是