Selenium项目的单元测试

时间:2016-05-23 13:31:52

标签: java unit-testing selenium cucumber

关于最佳做法或实践的问题;)

我目前正在使用Java中的Selenium开发测试自动化系统。它应该用于webapp的端到端验收测试。测试用例用Gherkin语言编写,并由BDD框架Cucumber(Cucumber-JVM)执行。低级函数使用Selenium / WebDriver与AUT和浏览器进行交互。 Selenium代码使用PageObject模式构建,该模式抽象了WebDriver的使用。黄瓜步骤定义只调用PageObjects提供的方法。

随着项目的继续并变得越来越复杂,我想开始编写单元测试以确保验收测试,以及围绕这些测试的实用程序功能,做他们应该做的事情:)

现在回答问题:

编写测试自动化项目的单元测试是否可行?

主要的问题是,在我第一次使用TestNG进行单元测试的过程中,我意识到,我的单元测试结果与接受测试已经做的或多或少相同。这是适得其反的,因为单元测试非常慢并且有很多依赖性。

或者只测试实用程序类并让Selenium代码处于这种情况。即。只测试可以在不调用Selenium WebDriver并与AUT交互的情况下测试的东西吗?

注意只是为了确保我没有被误解。我问的是在验收测试代码和所有辅助代码上运行单元测试。不是使用像JUnit或TestNG这样的单元测试框架来运行Selenium测试用例。

任何帮助和/或想法都将受到赞赏,因为我不知道如何解决这个问题。那就是如果编写测试测试是明智的;)

2 个答案:

答案 0 :(得分:4)

我确信有人会认为我的回答是“自以为是”并将其投票,但我认为

是的,如果您有一个测试框架,您需要进行验收测试,那么框架本身需要进行测试

根据我的经验,价值分为两个方面:

  1. 能够自信地更改框架。当你创建一些函数时,你会对它有很多了解,即它支持的用例,它的设计目的等等。但是其他人(或者甚至是你从现在开始的一年)可能没有相同的知识水平,即使有文档。因此,每当有人需要对行为进行一些轻微修改(因为他们没有信心改变现有功能)时,任何新功能都会弹出,或者有人可能会打破一大堆验收测试。

    如果这些是真正的单元测试,能够完全独立于任何事物运行(使用模拟,预定义的静态测试数据等),那是最好的。

  2. 保护自己免受Selenium本身的意外更改/错误(或其他重要的第三方库)。当你将Selenium更新到下一个版本时(通常需要每3-6个月完成一次),他们总是有可能改变你依赖的默认值(甚至不知道),或者破坏某些东西,或者突然之间会返回一个不同的异常,或者不会在之前的异常处抛出异常等等。当然不需要随便拿走并复制Selenium自己的单元测试,但是当谈到非平凡的事情,或依赖于文档较差的某些功能时,这些测试可能会有很大帮助。

    那些是集成测试。理想情况下,它们应该针对仅测试的webapp(而不是真正的应用程序)运行,以便于测试的方式复制特定测试的行为。

  3. 当然也可能有一些妥协。例如,有一小部分验收测试用作单元/集成测试(它们首先运行,而其他测试仅在它们通过时运行)。当你在测试框架中调试/修复问题时,可能会更便宜地开始使用它们并慢慢迁移到正确的单元/集成测试。

    另一个问题是如何将测试框架的测试与产品的实际验收测试分开。对我有用的是在两个独立的项目中保持测试框架和验收测试。这样我就可以根据需要多次更改框架,构建它(也包括运行单元和集成测试)。当所有单元和集成测试都通过时,我可以更新实际验收测试所使用的版本。

答案 1 :(得分:1)

就个人而言,我不会编写测试代码的测试代码。

编写测试来保护自己免受3种类型的错误:像Selenium这样的派对工具不是我会做的事情。如果测试通过并且预期结果得到验证,那对我来说就足够了。

当我升级到新版本的Selenium时,我会在我处于工作状态时这样做。即所有测试都通过了唯一的变化是Selenium版本。如果我现在有破坏的测试,我知道Selenium在这个版本中的行为与我预期的不同,并且可以采取相应的行动。

我会为我可能需要的任何复杂的实用程序功能编写测试。

但是,我会努力编写非常容易理解的测试代码,并避免任何远程复杂的测试代码。然后小心验证每个测试都验证了我期望的行为。