Unit testing 测试测试?

Unit testing 测试测试?,unit-testing,automated-tests,Unit Testing,Automated Tests,我主要把时间花在win32和.NET应用程序的自动化测试上,这需要我们30%的时间编写,70%的时间维护。我们一直在寻找减少维护时间的方法,并且已经转移到一个可重用的测试库,它涵盖了我们软件的大部分关键组件。此外,我们正在进行一些工作,以使我们的图书馆达到可以使用的状态 我一直在考虑对我们的测试库进行单元测试,但我想知道这样做是否值得。我强烈支持软件的单元测试,但我不确定如何处理测试代码 您认为自动化Gui测试库应该进行单元测试吗?还是仅仅是浪费时间?您确实没有理由可以/不应该对库进行单元测试。

我主要把时间花在win32和.NET应用程序的自动化测试上,这需要我们30%的时间编写,70%的时间维护。我们一直在寻找减少维护时间的方法,并且已经转移到一个可重用的测试库,它涵盖了我们软件的大部分关键组件。此外,我们正在进行一些工作,以使我们的图书馆达到可以使用的状态

我一直在考虑对我们的测试库进行单元测试,但我想知道这样做是否值得。我强烈支持软件的单元测试,但我不确定如何处理测试代码


您认为自动化Gui测试库应该进行单元测试吗?还是仅仅是浪费时间?

您确实没有理由可以/不应该对库进行单元测试。有些部件可能太难进行正确的单元测试,但大多数部件可能可以进行单元测试,而不会出现任何特殊问题


实际上,对这种代码进行单元测试可能特别有益,因为您希望它既可靠又可重用。

我认为您不应该对单元测试进行单元测试

但是,如果您已经编写了自己的测试库,其中包含自定义断言、键盘控制器、按钮测试器或其他任何东西,那么是的。您应该编写单元测试来验证它们是否都按预期工作


例如,NUnit库是经过单元测试的。

首先,我发现将单元测试视为“可执行规范”而不是测试非常有用。我写下我想要我的代码做什么,然后实现它。我从编写单元测试中得到的大部分好处是,它们推动了实现过程并集中了我的思维。它们可以重用来测试我的代码,这几乎是一个令人高兴的巧合

测试似乎只是解决问题的一种方式,而不是解决问题。谁来测试测试这些测试的测试?TDD用来确保测试真正有用的“技巧”是先让测试失败。这可能是你在这里也可以使用的东西。编写测试,看到它失败,然后修复代码。

理论上,它是软件,因此应该进行单元测试。如果您正在运行自己的单元测试库,尤其是,您将希望在运行时对其进行单元测试


然而,您的主软件系统的实际单元测试永远不应该增长到需要单元测试的程度。如果它们非常复杂,需要进行单元测试,那么您需要对软件进行一些认真的重构,并注意简化单元测试。

您可能想看看

简而言之,代码测试测试,测试测试代码。

测试原子钟
让我从一个类比开始。假设你是 带着原子钟旅行。你怎么知道这钟是开着的 校准正确吗

一种方法是用原子钟问你的邻居(因为每个人 随身携带一个)并比较两者。如果两者报告相同 时间,那么你有高度的信心他们都是正确的

如果它们不同,那么你知道其中一个是错的

所以在这种情况下,如果你问的唯一问题是,“我的 “钟的时间正确吗?”,那么你真的需要第三个钟吗 测试第二个时钟,第四个时钟测试第三个时钟?如果不是 全部的避免堆栈溢出

英普:这是在你有多少时间和你想要多少质量之间的折衷

  • 如果我要使用自制的测试设备,我会在时间允许的情况下进行测试
  • 如果我使用的是第三方工具,我希望供应商已经对其进行了测试

就我个人而言,我不会对我的自动化库进行单元测试,而是根据基线的修改版本运行它们,以确保所有检查点都能正常工作。这里的原则是,我的自动化主要用于回归测试,例如,当前运行的结果与预期结果相同(通常等同于上次运行的结果)。通过对一组经过适当修改的预期结果运行测试,所有测试都应该失败。如果他们没有,您的测试套件中就有一个bug。这是一个借用自变异测试的概念,我发现它非常适合检查GUI自动化套件。

测试测试代码,代码测试测试。当您以两种不同的方式(一次在测试中,一次在代码中)说出相同的意图时,两者都出错的概率非常低(除非需求已经出错)。这可以与会计师使用的复式记账法相比较。看

最近在委员会的评论中也讨论了同样的问题


关于您的问题,应该测试GUI测试库吗。。。如果我理解正确,您正在创建自己的测试库,并且您想知道是否应该测试您的测试库。对为了能够依靠库正确报告测试,您应该进行测试,确保库不会报告任何误报或误报。不管测试是单元测试、集成测试还是验收测试,至少应该有一些测试

通常,在编写代码之后编写单元测试已经太迟了,因为这样代码就更容易耦合。单元测试迫使代码更加解耦,因为否则小单元(一个类或一组密切相关的类)无法单独测试

当代码已经编写好时,通常只能添加集成测试和验收测试。它们将在整个系统运行的情况下运行,因此您可以确保功能正常工作,但是覆盖每个角落的情况和执行路径比单元测试更困难。

Kent Beck的书《测试驱动开发:通过示例》中有一个测试驱动开发的示例
begin
  //Populate TheGrid
  try
    CheckGrid(<incorrect values>, TheGrid);
    LFlagTestFailure := False;
  except
    on E: ETestFailure do
      LFlagTestFailure := True;
  end;
  Check(LFlagTestFailure, 'CheckGrid method did not detect errors in grid content');
end;