Unit testing 硒测试后清理数据

Unit testing 硒测试后清理数据,unit-testing,selenium,Unit Testing,Selenium,我正在为一个内部web应用程序设置一些Selenium测试,并寻求关于测试“最佳实践”的建议。其中一个测试将通过UI添加一些无法通过UI删除的数据(例如,您可以通过web应用程序添加记录,但删除需要与内部人员联系以在数据库级别删除记录)。在Selenium测试运行后,您通常如何解释清理数据 讨论中的应用程序是用PHP编写的,我使用PHP进行测试(使用Selenium RC和SimpleTest),但我对其他工具持开放态度,等等。因为这只是一个广泛的最佳实践问题。正在测试的应用程序在我们的开发环境

我正在为一个内部web应用程序设置一些Selenium测试,并寻求关于测试“最佳实践”的建议。其中一个测试将通过UI添加一些无法通过UI删除的数据(例如,您可以通过web应用程序添加记录,但删除需要与内部人员联系以在数据库级别删除记录)。在Selenium测试运行后,您通常如何解释清理数据

讨论中的应用程序是用PHP编写的,我使用PHP进行测试(使用Selenium RC和SimpleTest),但我对其他工具持开放态度,等等。因为这只是一个广泛的最佳实践问题。正在测试的应用程序在我们的开发环境中,所以我并不特别担心测试带来的数据

一些想法:

  • 在Selenium测试中手动连接到数据库以清理数据
  • 使用类似的方法来管理这个
  • 只需添加数据,不必担心清理数据(又称惰性方法)
  • 谢谢


    编辑:似乎大多数想法都围绕着相同的结论:处理一组已知的数据,并在测试完成后恢复。这种机制可能会因语言、数据量等的不同而有所不同。但这似乎适合我的需要。

    我们有一个数据库还原例程的web前端。我们的测试要做的第一件事是恢复一个“众所周知”的起点。

    我在Rails应用程序中使用Selenium,并使用fixture机制从测试数据库加载和卸载数据。它类似于DbUnit方法,不过由于数据量的原因,我不会在测试之间卸载和重新加载。(尽管如此。)

    将webapp指向一个不同的数据库实例,您可以在完成测试后擦除该实例。然后,如果需要调试,您将在测试运行后检查数据库,完成调试后,您可以吹走所有表。如果需要种子数据,您可以获取当前数据库的导出,并在测试之前将其还原到新实例中。

    避免惰性方法。这没有好处,最终会让你失望。请参阅我之前对此主题的回答。

    同意此处的其他答案。我已经将Selenium和DBUnit测试连接到了我过去参与的3个项目中。在第一个项目中,我们尝试了惰性方法,但可以预见它会堆在一起,所以我们使用了DBUnit,我没有回头看

    我知道您使用的是PHP,所以请将DBUnit/JUnit翻译成PHP等价物

    有两点:

    • 使用尽可能少的数据。具有 您需要运行许多selenium测试 DBUnit加载要尽可能快 可能的因此,尽量减少风险 正在加载的数据量
    • 仅加载更改的数据。经常 你可以跳过那些永远不会出现的表格 已被web应用程序更改。参考数据 桌子等等。不管你怎么说 想要创建一个单独的DBUnitXML吗 用于加载此数据的文件/db备份 万一你不小心把它弄丢了
    • 让JUnit selenium测试选择 他们是否需要重新加载。一些硒测试不会改变任何结果 数据,因此无需重新加载 它们运行后,数据库将被删除。在我的每一次硒测试中,我 重写/实现方法以返回所需的DBUnit行为

      @凌驾 受保护的DBUnitRunConfig getDBUnitRunConfig(){

      }

    (无法正确格式化该代码段。)其中DBUnitRunConfig为:

    public enum DBUnitRunConfig {
        NONE, 
        RUN_IF_NOT_YET_RUN_IN_ANY_TEST_CASE, 
        RUN_ONCE_FOR_THIS_TEST_CASE, 
        RUN_FOR_EACH_TEST_IN_TEST_CASE
    };
    
    这减少了通过测试所需的时间。然后,启用Selenium的超类(或助手类)可以为给定的测试运行DBUnit,也可以不运行DBUnit

    public enum DBUnitRunConfig {
        NONE, 
        RUN_IF_NOT_YET_RUN_IN_ANY_TEST_CASE, 
        RUN_ONCE_FOR_THIS_TEST_CASE, 
        RUN_FOR_EACH_TEST_IN_TEST_CASE
    };