如何在TDD中找到负面测试的余额?

时间:2018-04-03 14:39:00

标签: tdd

让我们想象一下,我们需要开发一个只显示当地室外温度的应用程序。所以,当你使用TDD时,你会写一个测试用例:

describe 'App'
  it 'shows the local temperature'

那就是它。一周之后,你意识到人们会因为看到完整的当地天气预报而付费,所以你继续TDD:

describe 'App'
  it 'shows the local temperature'
  describe 'when they pay me 5$'
    it 'shows full weather forecast'

但是,有些人建议添加阴性测试以避免误报:

describe 'App'
  it 'shows the local temperature'
  it 'does not show full weather forecast'
    describe 'when they pay me 5$'
      it 'shows full weather forecast'

// or even

describe 'App'
  it 'shows the local temperature'
    describe 'when scrooge'
      it 'does not show full weather forecast'
    describe 'when they pay me 5$'
      it 'shows full weather forecast'

虽然阻止意外地让付费用户无法看到完整的天气预报,但这并不是真正可扩展的(例如,我们有很多接入层)。

问题是:是否有任何众所周知或已建立的做法可以平衡TDD中的假阳性检测?

3 个答案:

答案 0 :(得分:3)

简短的回答是否定。只是为了给你一些背景信息,这一切都归结为负面测试的要求的重要性。在您给出的示例中,如果对于用户来说防止意外允许不付费以查看全天候预测很重要,那么您会考虑添加(TDD)否定测试。

然而,通常使用TDD,您首先编写一个积极的测试,为“快乐路径”场景构建您的软件。这样你就可以得到一个可用的软件。 TDD就是关于小型设计。

然后,如果要求在负面情景下是关键的,那么您可以考虑稍后添加它们。这可能是一旦软件处于测试阶段,您可能会发现某些负面测试至关重要。因此,您可以根据需要开始添加它们。记住要有一个思维模式,你只需要在绝对需要时添加它们。

答案 1 :(得分:1)

  

但是,有些人建议添加一个否定测试以避免错误   阳性:

它不会避免误报。当应用程序没有真正显示温度时,误报为it 'shows the local temperature'

正如Spock指出的那样,系统地添加负面测试(测试不会发生事件的测试)是有问题的,因为可以通过这种方式测试的东西没有尽头。

我经常写回归测试来查找在现实中确实发生的错误,但很少有机会检查那些可能以多种模糊方式出错的错误。

答案 2 :(得分:0)

另一种思维方式是将该功能重新定义为“当且仅当用户付费时,该应用才显示全天候”。

如果用一种方法或两种方法测试,那就是品味问题。像这样的伪代码:

userSeesFullWeatherOnMainPageIfAndOnlyHeHasPaid:
    freeUser = aNewUser()
    freeUser.getsMainPage()
    freeUser.shallNotSeeFullWeather()

    paidUser = aNewUser()
    paidUser.paysForFullWeather()
    paidUser.getsMainPage()
    paidUser.shallSeeFullWeather()