Selenium 项目的单元测试
Unit testing for a Selenium project
关于最佳实践或实践的问题 ;)
我目前正在 Java 中使用 Selenium 开发测试自动化系统。它应该用于 Web 应用程序的端到端验收测试。测试用例使用 Gherkin 语言编写,并由 BDD 框架 Cucumber (Cucumber-JVM) 执行。低级函数使用 Selenium/WebDriver 与 AUT 和浏览器进行交互。 Selenium 代码是使用 PageObject 模式构建的,该模式抽象了 WebDriver 的使用。 Cucumber 步骤定义仅调用 PageObjects 提供的方法。
随着项目的继续并变得越来越复杂,我想开始编写单元测试以确保验收测试以及围绕这些的实用程序功能,做他们应该做的事情:)
现在回答问题:
为测试自动化项目编写单元测试是否可行?
主要问题是,在我第一次使用 TestNG 进行单元测试时,我意识到,我的单元测试最终或多或少地完成了验收测试已经完成的相同工作。这适得其反,因为单元测试非常慢并且有很多依赖性。
或者只是测试实用程序 类 并在这种情况下保留 Selenium 代码。 IE。仅测试无需调用 Selenium WebDriver 并与 AUT 交互即可测试的内容?
注意 只是为了确保我没有被误解。我问的是验收测试代码和所有辅助代码的 运行 单元测试。与 运行 使用 JUnit 或 TestNG 等单元测试框架的 Selenium 测试用例无关。
任何帮助 and/or 的想法将不胜感激,因为我不确定如何解决这个问题。也就是说,如果为测试编写测试是明智的 ;)
我敢肯定有人会认为我的回答“固执己见”并投反对票,但我认为
是的,如果您有用于验收测试的测试框架,则框架本身也需要进行测试。
根据我的经验,价值体现在两个方面:
可以放心的改框架。当你创建一些功能时,你对它了解很多,即它支持哪些用例,它被设计用来做什么等等。但其他人(甚至一年后的你)可能不具备相同水平的知识,即使有文档。因此,要么每当有人需要对行为进行一些细微的修改时就会弹出新功能(因为他们没有信心更改现有功能),要么有人可能会破坏一大堆验收测试。
最好是真正的单元测试,能够运行完全独立于任何事物(使用模拟、预定义的静态测试数据等)。
保护自己免受 Selenium 本身(或其他重要的第 3 方库)中的意外更改/错误的影响。当您将 Selenium 更新到下一个版本时(通常需要每 3-6 个月完成一次),他们总是有可能更改您所依赖的一些默认设置(甚至不知道),或者破坏某些东西,或者突然 returns 一个不同的异常,或者不抛出它以前抛出的异常等等。当然没有必要得意忘形地重复 Selenium 自己的单元测试,但是当涉及到不平凡的事情,或者依赖于一些文档不完善的特性时,这些测试可能会有很大帮助。
那些是集成测试。理想情况下,他们应该 运行 反对以方便测试的方式复制经过专门测试的行为的仅测试 web 应用程序(不是真正的应用程序)。
当然也可以做出一些妥协。例如,有一小部分验收测试用作单元/集成测试(它们首先 运行,其他测试仅 运行 如果它们通过)。从这些开始可能更便宜,然后在调试/修复测试框架中的问题时慢慢迁移到适当的 unit/integration 测试。
另一个问题是如何将测试框架的测试与产品的实际验收测试分开。对我有用的是将测试框架和验收测试保留在 2 个独立的项目中。这样我就可以更改框架,并在需要时多次构建它(其中还包括 运行ning 单元和集成测试)。当所有单元测试和集成测试都通过后,我就可以更新实际验收测试使用的版本了。
就我个人而言,我不会编写测试代码的测试代码。
编写测试来保护自己免受 3:rd 派对工具(如 Selenium)中的错误的影响,这不是我会做的事情。如果测试通过并且预期结果得到验证,那么这对我来说就足够了。
当我升级到新版本的Selenium时,我会在有工作状态时进行。 IE。所有测试都通过了。唯一的变化是 Selenium 版本。如果我现在有失败的测试,我知道 Selenium 在这个版本中的行为与我预期的不同,并且可以采取相应的行动。
我会为我可能需要的任何复杂的实用程序功能编写测试。
然而,我会努力编写非常容易理解的测试代码,并避免其中任何远程复杂的东西。然后仔细验证每个测试是否验证了我期望的行为。
关于最佳实践或实践的问题 ;)
我目前正在 Java 中使用 Selenium 开发测试自动化系统。它应该用于 Web 应用程序的端到端验收测试。测试用例使用 Gherkin 语言编写,并由 BDD 框架 Cucumber (Cucumber-JVM) 执行。低级函数使用 Selenium/WebDriver 与 AUT 和浏览器进行交互。 Selenium 代码是使用 PageObject 模式构建的,该模式抽象了 WebDriver 的使用。 Cucumber 步骤定义仅调用 PageObjects 提供的方法。
随着项目的继续并变得越来越复杂,我想开始编写单元测试以确保验收测试以及围绕这些的实用程序功能,做他们应该做的事情:)
现在回答问题:
为测试自动化项目编写单元测试是否可行?
主要问题是,在我第一次使用 TestNG 进行单元测试时,我意识到,我的单元测试最终或多或少地完成了验收测试已经完成的相同工作。这适得其反,因为单元测试非常慢并且有很多依赖性。
或者只是测试实用程序 类 并在这种情况下保留 Selenium 代码。 IE。仅测试无需调用 Selenium WebDriver 并与 AUT 交互即可测试的内容?
注意 只是为了确保我没有被误解。我问的是验收测试代码和所有辅助代码的 运行 单元测试。与 运行 使用 JUnit 或 TestNG 等单元测试框架的 Selenium 测试用例无关。
任何帮助 and/or 的想法将不胜感激,因为我不确定如何解决这个问题。也就是说,如果为测试编写测试是明智的 ;)
我敢肯定有人会认为我的回答“固执己见”并投反对票,但我认为
是的,如果您有用于验收测试的测试框架,则框架本身也需要进行测试。
根据我的经验,价值体现在两个方面:
可以放心的改框架。当你创建一些功能时,你对它了解很多,即它支持哪些用例,它被设计用来做什么等等。但其他人(甚至一年后的你)可能不具备相同水平的知识,即使有文档。因此,要么每当有人需要对行为进行一些细微的修改时就会弹出新功能(因为他们没有信心更改现有功能),要么有人可能会破坏一大堆验收测试。
最好是真正的单元测试,能够运行完全独立于任何事物(使用模拟、预定义的静态测试数据等)。
保护自己免受 Selenium 本身(或其他重要的第 3 方库)中的意外更改/错误的影响。当您将 Selenium 更新到下一个版本时(通常需要每 3-6 个月完成一次),他们总是有可能更改您所依赖的一些默认设置(甚至不知道),或者破坏某些东西,或者突然 returns 一个不同的异常,或者不抛出它以前抛出的异常等等。当然没有必要得意忘形地重复 Selenium 自己的单元测试,但是当涉及到不平凡的事情,或者依赖于一些文档不完善的特性时,这些测试可能会有很大帮助。
那些是集成测试。理想情况下,他们应该 运行 反对以方便测试的方式复制经过专门测试的行为的仅测试 web 应用程序(不是真正的应用程序)。
当然也可以做出一些妥协。例如,有一小部分验收测试用作单元/集成测试(它们首先 运行,其他测试仅 运行 如果它们通过)。从这些开始可能更便宜,然后在调试/修复测试框架中的问题时慢慢迁移到适当的 unit/integration 测试。
另一个问题是如何将测试框架的测试与产品的实际验收测试分开。对我有用的是将测试框架和验收测试保留在 2 个独立的项目中。这样我就可以更改框架,并在需要时多次构建它(其中还包括 运行ning 单元和集成测试)。当所有单元测试和集成测试都通过后,我就可以更新实际验收测试使用的版本了。
就我个人而言,我不会编写测试代码的测试代码。
编写测试来保护自己免受 3:rd 派对工具(如 Selenium)中的错误的影响,这不是我会做的事情。如果测试通过并且预期结果得到验证,那么这对我来说就足够了。
当我升级到新版本的Selenium时,我会在有工作状态时进行。 IE。所有测试都通过了。唯一的变化是 Selenium 版本。如果我现在有失败的测试,我知道 Selenium 在这个版本中的行为与我预期的不同,并且可以采取相应的行动。
我会为我可能需要的任何复杂的实用程序功能编写测试。
然而,我会努力编写非常容易理解的测试代码,并避免其中任何远程复杂的东西。然后仔细验证每个测试是否验证了我期望的行为。