说厨师可以制作食谱,而Sous-Chefs可以创建必须由主厨批准的食谱。
你想测试一下,当主厨查看她的主页时,她会看到她自己创建的食谱。您还想测试她是否看到有食谱在等待她的批准。
我可以想到两种方法:
我非常不喜欢这两种方法。
可能有更多原因,但这两个原因相当庞大。
为了测试而有多余标记是多么烦人啊!为了测试,用户不应该增加下载大小。
对此有什么好处?我有兴趣听到任何替代方案,无论你用什么语言思考。我主要想在Ruby,Test :: Unit,Minitest,RSpec和Cucumber(虽然我的Cuke技能陈旧),但是如果其他语言/框架如果想到这一点,我也很想知道他们在做什么。
答案 0 :(得分:4)
使用页面范例。
尽可能在能力级别(高级别)尽可能地以人的方式表达步骤,并使用特定示例。例如,如果我使用黄瓜,我可能会说:
鉴于苏斯厨师为青蛙馅饼制作了配方 当厨师寻找食谱批准时 然后Frog Pie的食谱应该在列表中。
在这些步骤的代码中,实例化或查找您正在寻找的特定页面,其中页面是表示页面功能的对象。然后,该页面可以所有用户可以对页面执行的操作 - 查找配方,批准配方,移动到其他页面等。
这样,如果您需要更改步骤的基础代码,您只需在一个位置更改它,并且特定页面的所有更改将在一起。因为你已经根据你提供的功能来表达场景,所以场景不太可能需要进行太多改变(除非你发现你的业务需要与你提供的业务不同的功能)。
这也适用于基于窗口的应用程序,每个小部件或模块都是特定的页面。
仅为测试提供额外的ID也没关系。有时设计师也喜欢使用它们。
答案 1 :(得分:4)
我至少看到两个选项:
避免通过UI测试业务逻辑。编写一个返回纯数据结构的“服务”或“用例控制器”对象。换句话说,您为系统构建了一个API。您的单元测试通过API访问系统。您的UI通过相同的API访问系统,但视图中几乎没有逻辑。请参阅http://www.confreaks.com/videos/759-rubymidwest2011-keynote-architecture-the-lost-years或http://www.cleancoders.com/codecast/clean-code-episode-7/show。
使用“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测试更容易实现。