推荐阅读如何编写正确的特征文件
Recommended reading on how to write proper feature files
我们最近开始使用 Cucumber 练习 BDD,大约几个月后 - 我们可以清楚地知道我们的致命弱点是编写可维护的功能文件。例如:
一些团队编写了非常技术性的功能文件,其中包含有关内部实现的信息。这使得大多数非技术人员无法阅读功能文件。另一个例子是,一些团队编写了非常通用的特性文件——考虑尽可能少地定义步骤以使其保持干燥——但随着时间的推移,他们发现当你限制自己时,很难有一个可读的特性文件整个项目中的少量步骤定义。
互联网上有一些关于如何正确编写特征文件的技巧,但这些技巧是有限的,对于具体的例子很有帮助。是否有任何网站或一本好书可以分享一些最佳实践?从多年经验中总结出的一些做法?
您之所以难以找到有关该主题的权威文本,是因为据我所知,没有。一旦您开始并理解了 BDD 的要点,那么困难的部分就是找出适合您的方法。有一些非常好的书可以帮助您更成功地做到这一点 - 例如 Specification By Example,但它不是一个通用的解决方案。
关于如何从技术上编写你的场景,这取决于他们的观众。如果使用 BDD 的好处之一是所有相关利益相关者都可以在开发之前讨论功能,那么在每个人都可以访问的级别编写它们是其中的必要部分。也就是说,没有任何理由做得太过分。如果每个人都可以做出贡献,那么为什么要更加努力地减少技术含量呢?
在可维护性方面,抽象是关键。以网站的 BDD 为例,因为这是我最有经验的,实现它的最重要方法是使用页面对象或包装器在步骤定义和正在测试的对象之间实现抽象层。通过这样做,您可以拥有许多几乎相同的步骤定义,但使用您的包装器略有不同,但就可维护性而言,绝大多数将通过对您的页面对象进行小的更改来实现,这些更改会传播到您的其余自动化套件。
这就是我多年来尝试多种不同方法后的工作方式。我不认为有很多步骤定义会使代码不那么枯燥,只要它们实现了一个包装器,就没有太多重复的代码。
编辑:在评论中回答您的问题...
真的只有一种方法,我见过的所有变体都与工具有关。您使用的工具(如果您选择使用任何工具)将取决于被测系统。唯一真正重要的想法是为处理获取、设置和与测试对象交互的屏幕的每个 page/screen/area 设置一个包装器。然后您的步骤定义包含所有实际逻辑。例如处理您的断言或您要调用哪些页面对象方法来模拟用户的行为。
我们最近开始使用 Cucumber 练习 BDD,大约几个月后 - 我们可以清楚地知道我们的致命弱点是编写可维护的功能文件。例如:
一些团队编写了非常技术性的功能文件,其中包含有关内部实现的信息。这使得大多数非技术人员无法阅读功能文件。另一个例子是,一些团队编写了非常通用的特性文件——考虑尽可能少地定义步骤以使其保持干燥——但随着时间的推移,他们发现当你限制自己时,很难有一个可读的特性文件整个项目中的少量步骤定义。
互联网上有一些关于如何正确编写特征文件的技巧,但这些技巧是有限的,对于具体的例子很有帮助。是否有任何网站或一本好书可以分享一些最佳实践?从多年经验中总结出的一些做法?
您之所以难以找到有关该主题的权威文本,是因为据我所知,没有。一旦您开始并理解了 BDD 的要点,那么困难的部分就是找出适合您的方法。有一些非常好的书可以帮助您更成功地做到这一点 - 例如 Specification By Example,但它不是一个通用的解决方案。
关于如何从技术上编写你的场景,这取决于他们的观众。如果使用 BDD 的好处之一是所有相关利益相关者都可以在开发之前讨论功能,那么在每个人都可以访问的级别编写它们是其中的必要部分。也就是说,没有任何理由做得太过分。如果每个人都可以做出贡献,那么为什么要更加努力地减少技术含量呢?
在可维护性方面,抽象是关键。以网站的 BDD 为例,因为这是我最有经验的,实现它的最重要方法是使用页面对象或包装器在步骤定义和正在测试的对象之间实现抽象层。通过这样做,您可以拥有许多几乎相同的步骤定义,但使用您的包装器略有不同,但就可维护性而言,绝大多数将通过对您的页面对象进行小的更改来实现,这些更改会传播到您的其余自动化套件。
这就是我多年来尝试多种不同方法后的工作方式。我不认为有很多步骤定义会使代码不那么枯燥,只要它们实现了一个包装器,就没有太多重复的代码。
编辑:在评论中回答您的问题...
真的只有一种方法,我见过的所有变体都与工具有关。您使用的工具(如果您选择使用任何工具)将取决于被测系统。唯一真正重要的想法是为处理获取、设置和与测试对象交互的屏幕的每个 page/screen/area 设置一个包装器。然后您的步骤定义包含所有实际逻辑。例如处理您的断言或您要调用哪些页面对象方法来模拟用户的行为。