BDD 是一种“由外而内”的方法,据我所知,这意味着你从你所知道的开始。你编写你的故事和场景,然后实现最外层的领域对象,在你通过服务层、领域层等的过程中“向内”和“有意识地”发现合作者。对于一个还不存在的合作者,你嘲笑它(或“伪造它”)直到你成功。(我直接从 Dan North 和 Kent Beck 那里窃取了其中的一些术语)。
那么,UI 是如何融入其中的呢?
借用 North 的一篇博客文章,他重写了以下内容:
Given an unauthenticated user
When the user tries to navigate to the welcome page
Then they should be redirected to the login page
When the user enters a valid name in the Name field
And the user enters the corresponding password in the Password field
And the user presses the Login button
Then they should be directed to the welcome page
进入这个:
Given an unauthenticated user
When the user tries to access a restricted asset
Then they should be directed to a login page
When the user submits valid credentials
Then they should be redirected back to the restricted content
他这样做是为了消除不相关域中的语言,其中之一是 UI(“名称字段”、“密码字段”、“登录按钮”)。现在 UI 可以改变并且故事(或者更确切地说,故事的意图)不会中断。
因此,当我为这个故事编写实现时,我是否使用 UI?是通过 Selenium 测试启动浏览器并执行“用户提交有效凭据”,还是直接连接到底层实现(例如身份验证服务)更好?顺便说一句,我使用jBehave作为我的 BDD 框架,但它也可以是 Cucumber、rSpec 或其他一些框架。
我倾向于不以自动化方式测试 UI,并且我对 Selenium 等 GUI 自动化工具持谨慎态度,因为我认为测试 (1) 可能过于脆弱并且 (2) 在执行成本最高的地方运行。所以我倾向于手动测试 UI 的美观性和可用性,并将业务逻辑留给更低、更容易自动化的层。(并且可能层不太可能改变。)
但我愿意接受这一点。那么,BDD 是否适用于 UI?
PS。我已经阅读了关于这个主题的所有帖子,但没有一个能真正解决我的问题。 这个最接近,但我不是在谈论将 UI 分成一个单独的故事。相反,我说的是出于 BDD 的目的而完全忽略它。