【问题标题】:Using TDD to Create a Report使用 TDD 创建报告
【发布时间】:2011-10-30 23:13:02
【问题描述】:

我目前正在尝试使用 PHPUnit 来了解测试驱动开发 (TDD),并且我有一个关于使用 TDD 编写报告的问题。

首先:我了解了TDD的基本流程:

但我的问题是:如何使用 TDD 编写报告?

假设您的任务是编写一份报告,按颜色、类型和重量计算通过给定十字路口的汽车数量。现在,以上所有数据都已捕获到数据库表中,但系统会要求您将其关联起来。

如何为不知道结果的方法编写测试?关联此数据的方法的结果是否会根据日期范围和用户在运行报告时可能提供的其他限制标准而改变?在这种情况下,您如何使用 PHPUnit 之类的框架在 TDD 的范围内工作?

【问题讨论】:

    标签: php unit-testing tdd phpunit


    【解决方案1】:

    您事先创建代表您将在生产中收到的数据类型的测试数据,然后根据该数据测试您的代码,每次运行测试时刷新表(即在您的 SetUp() 函数中)。

    无论您要测试什么,都无法针对您将在生产中收到的实际数据进行测试。您只是在测试代码在给定场景下是否按预期工作。例如,如果您在测试表中加载五行蓝色汽车,那么您希望报告在测试时显示五辆蓝色汽车。您正在测试报告的各个部分,因此当您完成后,您将自动测试整个报告。

    作为比较,如果您要测试一个函数,该函数需要一个介于 1 和 100 之间的正整数,您会编写 100 个测试来测试每个单独的整数吗?不,你会测试范围内的东西,然后测试边界上和周围的东西(例如 -1、0、1、50、99、100 和 101)。例如,您不测试 55,因为该测试将沿着与 50 相同的代码路径进行。

    确定您的代码路径和要求,然后为每一个创建合适的测试。您的测试将反映您的要求。如果测试通过,那么代码将准确地表示您的需求(如果您的需求是错误的,TDD 无论如何也无法挽救您)。

    【讨论】:

      【解决方案2】:

      在运行测试套件和运行脚本时,您不会使用相同的数据。您使用测试数据。所以如果你想与数据库交互,一个好的解决方案是创建一个sqlite database stored in your ram

      同样,如果您的函数与文件系统交互,您可以使用a virtual filesystem

      如果你必须与对象交互,you can mock them too

      好消息是您可以使用您在编写代码时想到的所有恶性边缘情况数据进行测试(嘿,如果数据包含未转义的引号怎么办?)。

      【讨论】:

        【解决方案3】:

        直接针对您的生产服务器进行测试非常困难,而且通常是不明智的,因此最好的办法是伪造它。

        首先,您创建一个stub,一个代表数据库的特殊对象,它允许您让您的单元测试假装某些值来自数据库,而实际上它来自您。如果需要,您拥有的东西能够生成您不知道但仍可通过测试访问的东西。

        一旦一切正常,您就可以在数据库本身的某个测试模式中拥有一个数据集——基本上,您使用不同的参数进行连接,因此当它认为它正在查看 PRODUCTION.CAR_TABLE 时,它确实在查看TESTING.CAR_TABLE。您甚至可能希望每次都测试删除/创建表(尽管这可能有点多,但确实会导致更可靠的测试)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多