测试:如何测试该视图包含所需的数据

时间:2012-05-18 21:48:48

标签: view tdd integration-testing bdd

说厨师可以制作食谱,而Sous-Chefs可以创建必须由主厨批准的食谱。

你想测试一下,当主厨查看她的主页时,她会看到她自己创建的食谱。您还想测试她是否看到有食谱在等待她的批准。

我可以想到两种方法:

  1. 测试该视图是否包含某些字词,例如“您的食谱”和“等待您批准的食谱”
  2. 为您正在使用的html元素添加不必要的属性,以便您可以检查具有“id = recipe_1”或“data-for-the-sake-of-testing = 1”的元素
  3. 我非常不喜欢这两种方法。

    为什么方法#1糟透了

    1. 难以置信的脆弱测试。每次你想对副本进行微小更新时,测试都会中断。
    2. I18N?如何使用这种方法?
    3. 可能有更多原因,但这两个原因相当庞大。

      为什么方法#2糟透了

      为了测试而有多余标记是多么烦人啊!为了测试,用户不应该增加下载大小。


      对此有什么好处?我有兴趣听到任何替代方案,无论你用什么语言思考。我主要想在Ruby,Test :: Unit,Minitest,RSpec和Cucumber(虽然我的Cuke技能陈旧),但是如果其他语言/框架如果想到这一点,我也很想知道他们在做什么。

4 个答案:

答案 0 :(得分:4)

使用页面范例。

尽可能在能力级别(高级别)尽可能地以人的方式表达步骤,并使用特定示例。例如,如果我使用黄瓜,我可能会说:

  

鉴于苏斯厨师为青蛙馅饼制作了配方   当厨师寻找食谱批准时   然后Frog Pie的食谱应该在列表中。

在这些步骤的代码中,实例化或查找您正在寻找的特定页面,其中页面是表示页面功能的对象。然后,该页面可以所有用户可以对页面执行的操作 - 查找配方,批准配方,移动到其他页面等。

这样,如果您需要更改步骤的基础代码,您只需在一个位置更改它,并且特定页面的所有更改将在一起。因为你已经根据你提供的功能来表达场景,所以场景不太可能需要进行太多改变(除非你发现你的业务需要与你提供的业务不同的功能)。

这也适用于基于窗口的应用程序,每个小部件或模块都是特定的页面。

仅为测试提供额外的ID也没关系。有时设计师也喜欢使用它们。

答案 1 :(得分:4)

我至少看到两个选项:

  1. 避免通过UI测试业务逻辑。编写一个返回纯数据结构的“服务”或“用例控制器”对象。换句话说,您为系统构建了一个API。您的单元测试通过API访问系统。您的UI通过相同的API访问系统,但视图中几乎没有逻辑。请参阅http://www.confreaks.com/videos/759-rubymidwest2011-keynote-architecture-the-lost-yearshttp://www.cleancoders.com/codecast/clean-code-episode-7/show

  2. 使用“page object”模式。编写一个对象,该对象读取应用程序生成的HTML代码,对其进行解析,并通过getter提供有趣的数据。这将使您的测试代码清晰明白。你的反对意见可能是你还有问题#2。事实上,我认为这不是一个问题。如果使用结构化HTML标记,则可以非常轻松地提取所需的信息。如果您将ID附加到页面的关键元素,将会容易得多;在你的例子中,我将有一个id =“my-recipes”的div和另一个id =“to-be-approved”的div。那应该够了;使用xpath或css选择器很容易找到其他任何东西。为什么你觉得这个令人反感?这些ID可能对其他用途有用,例如使用不显眼的JavaScript附加行为或使用CSS样式表附加样式。

答案 2 :(得分:1)

与#2同住,或许使用简短的评论(没有i18n问题,也不会对最终用户造成影响):

<!-- APPROVAL -->

documentation of simpletest很好看:

  

下次有机会,看看电路板,也许是主板   您正在查看的计算机。在大多数板上你会   找到奇怪的空洞,或没有任何附着的焊点或   也许是一个没有明显功能的引脚或插座。机会就是这样   其中一些是扩展和变化,但大多数   余数将用于测试。

如果少量多余的标记使您的产品更具可测性和可靠性,那么只需使用它!

答案 3 :(得分:1)

我个人试图不测试视图。我的意思是生成标记,因为那些测试看起来很脆弱。

相反,我专注于“数据提供者”方面,如果MVC Web框架是Controller。一旦控制器被单元测试覆盖,检查哪种数据控制器准备,你就非常安全。您创建的视图很容易通过运行应用程序进行测试,并看到它看起来没问题。

尽管如此,仍有一些视图测试方法。第一个是基于Selenium Driver的“端到端”测试模拟。它运行浏览器并初始化对您的应用程序的请求。测试正在检查输出HTML。测试登录到“已知”版本,这意味着测试知道当前的本地化是EN,例如。

基本上应该结合使用HTML标记值(“Recipies”)的方法,否则使用HTML元素id或类。我不会为测试添加任何额外的标记。

您可以尝试的另一种方法是审批测试。我相信有一个Ruby驱动程序 - http://approvaltests.sourceforge.net/。通过批准,您可以呈现视图并将HTML另存为黄金大师。如果View已更改,测试将失败。它比Selenium测试更容易实现。