Unit testing 针对带有功能测试的用户界面(UI)的测试驱动开发(TDD)

Unit testing 针对带有功能测试的用户界面(UI)的测试驱动开发(TDD),unit-testing,tdd,functional-testing,Unit Testing,Tdd,Functional Testing,正如我们所知,TDD的意思是“先编写测试,然后编写代码”。当涉及到单元测试时,这很好,因为您受到“单元”的限制 然而,当涉及到UI时,事先编写功能测试就没有什么意义了(对我来说)。这是因为功能测试必须验证一组(可能很长)功能需求。这通常可能跨越多个屏幕(页面),前提条件如“登录”、“最近插入了记录”等 测试驱动的开发很难在需要全功能测试来确定成功或失败的情况下使用。例如用户界面、与数据库一起工作的程序,以及一些依赖于特定网络配置的程序 (当然,维基百科不是“权威”,但这听起来很合乎逻辑。) 因

正如我们所知,TDD的意思是“先编写测试,然后编写代码”。当涉及到单元测试时,这很好,因为您受到“单元”的限制

然而,当涉及到UI时,事先编写功能测试就没有什么意义了(对我来说)。这是因为功能测试必须验证一组(可能很长)功能需求。这通常可能跨越多个屏幕(页面),前提条件如“登录”、“最近插入了记录”等

测试驱动的开发很难在需要全功能测试来确定成功或失败的情况下使用。例如用户界面、与数据库一起工作的程序,以及一些依赖于特定网络配置的程序

(当然,维基百科不是“权威”,但这听起来很合乎逻辑。)

因此,任何想法,或更好的体验,都应该先对UI进行功能测试,然后再编写代码。它有用吗?这是“痛苦”吗?

试试看。它促进编写规范故事,然后逐步执行,刺激应用程序改变其状态并验证结果


我使用BDD场景来编写UI代码。使用BDD故事描述业务请求,然后编写功能以将故事(即测试)变为绿色。

当您希望确信您的UI达到预期效果时,编程式UI测试是一种救赎。UI测试更接近于BDD(行为驱动开发),而不是TDD。但是术语是模糊的,不管你怎么称呼它们,它们都是有用的!
我有相当好的使用经验。我使用它来测试flex应用程序,但它主要用于测试web应用程序。点击链接!该网站提供了非常好的方法示例。

我已经用UI完成了验收TDD。我们将断言公共页眉和页脚是通过xpath’ing用于适当的ID的。我们还使用xpath来断言出现在与我们用于基本布局和结构的ID相关的正确标记中的数据。我们还可以断言输出页面是有效的html 4.01 strict。

ATDD非常有用,如果您能够很好地掌握UI的行为方式,并确保预先构建的功能测试的更改成本更低

当然,这样做的最大问题是UI通常没有完全指定

例如,如果您正在构建一个产品,并且仍然在进行快速迭代,以获得一个经过可用性测试并包含反馈的UI,那么您不希望通过对UI的每一个小更改来修复功能测试

考虑到功能测试通常很慢,反馈周期很长,而且随着用户界面的变化保持绿色是非常痛苦的


我在一个产品团队工作,在那里我们要做出完全相同的决定。我的一位同事很好地总结了我们的最终方法。(免责声明:请忽略此处特定于工具的详细信息。)

功能测试的TDD对我来说很有意义。写一个功能测试,看到它失败了,然后把问题分成几个部分,为每个部分写一个单元测试,为每个部分写代码,看到单元测试通过了,然后你的功能测试应该通过了

以下是Harry Percival在书中建议的工作流程(在线免费提供):


另外,您可以使用Selenium等自动化功能测试。您可以将它们添加到连续集成周期以及单元测试中。

测试UI的关键在于-UI的行为实际上与UI的外观不同。我们在心理上与之斗争,因此作为一种练习,我们可以玩一个类似俄罗斯方块的游戏,想象一下将它从一个平台(比如PC)移植到另一个平台(网络)。直觉是一切都是不同的-你必须重写一切!但实际上,所有这些都是一样的:

  • 游戏规则
  • 石块下落的速度
  • 行匹配的逻辑
  • 选择哪个街区
  • 还有更多

你明白了。唯一改变的是屏幕的绘制方式。因此,将UI的外观与工作方式分开。这很棘手,通常不可能完美,但很接近。我的建议是最后编写UI。如果您的行为正常,测试将提供反馈,屏幕将显示是否正确。这种组合提供了我们在没有UI的情况下从TDD获得的快速反馈。

我已经在许多复杂场景中成功地使用了TDD。TDD当然不限于单元测试。您是否有一个您认为对TDD来说会很痛苦的特定场景?编程UI测试是必须的,但我认为它们不应该在代码之前编写。这要视情况而定。我更喜欢在代码之前写。这让我可以在一些可以理解的小步骤中进步,保持专注,让一些东西一直在工作。行为描述使与企业主、客户、经理的沟通更加容易。另一个用例较少使用BDD,但更多的是功能测试,它是可视化组件的编程。如果我需要一些日本医生,这似乎很好。链接很好。请检查:)所以规范是在UI构建之前编写的,但是自动化的UI测试可能是在UI构建之后编写的,对吗?这就是BDD@Steven的优点,BDD场景中表达的规范是可执行的。顺便说一句,只要你提到与某个站点的关联,比如“这是我的领域…”也许没人会介意。TDD是你的东西之一。你也可以在你的个人资料页面上提到这个链接。我决不会阻止别人分享有用的信息俄罗斯方块就是一个可怕的例子。因为它需要文本输入,所以你可以通过单元测试获得比应用程序更多的覆盖率。用户界面测试的问题。输入是点击,输出是像素配置。现在想想