代码之家  ›  专栏  ›  技术社区  ›  Ali

PHP中的单元测试?[复制品]

  •  5
  • Ali  · 技术社区  · 16 年前

    我一直在考虑为我的php/mysql项目编写单元测试。

    困扰我的是我如何测试表单验证、Ajax功能和UI功能(如单击链接)。另外,我不希望测试依赖于UI的一个方面,所以如果我移动一个链接,那么所有测试都将中断。

    是否有人对我应该单元测试代码的哪些部分有任何想法/建议,大约应该在单元测试上花费多少时间,以及任何其他建议/提示?

    4 回复  |  直到 16 年前
        1
  •  2
  •   Alana Storm    16 年前

    至少从Web应用程序开发的角度来看,单元测试不能真正涵盖UI设计。什么单元测试 可以 帮助您的是测试所有控制器方法的输入/输出和/或挂起的任何单例/全局函数。因此,如果您希望在表单验证上获得单元测试覆盖率,请确保应用程序的结构能够使您独立于UI测试验证功能。

    class SomeController extends ... {
        ... function isAPhoneNumber($string){
            if(...) {
                return true;
            }
            else (...) {
                return false;
            }
        }
    }
    

    这确实会使所有将值获取到此方法的代码都未经过测试。我所看到的测试这一点的唯一有效方法是使用浏览器遥控器直接测试UI,如 Selenium . 这个 PHPUnit testing framework 具有使用Selenium的PHP驱动程序的钩子,这意味着您可以使用与其他单元测试相同的测试运行程序。

    你永远不会100%地确信无害的改变不会干扰你的硒测试,但是在开发过程中你可以采取一些步骤来最小化这一点。硒有 various different ways 要“瞄准”某个元素,它将单击或键入。您希望使用尽可能具体的目标,因此请尝试为所有(x)HTML节点提供一个唯一的ID元素。这确保了Selenium将单击一个链接,不管它在页面的哪个位置结束。

    如果无法使用唯一ID,请尝试用具有唯一标识符的HTML元素包装公共元素,然后使用Selenium的xpath tareting功能说“单击包含文本“signup”的链接(位于ID为“foo”的DIV中),或单击ID为“foo”的DIV中的第三个链接”。

    如果上面的项目不明显, 取决于Selenium IDE(或其他记录器)将选择的目标选择。他们的目标是确保在那个精确的页面上运行测试会得到相同的结果,这会给您带来非常脆弱的XPath。总是检查您记录的测试,并修复劣质目标。

    这里没有简单的答案。如果有的话,Web应用程序就不会那么麻烦了。

        2
  •  3
  •   Alana Storm    16 年前

    你应该把这部分 documentation of SimpleTest 看看他们的测试方法

    • 页面内容
    • 航行
    • 曲奇饼
    • 图像
    • 框架
    • 表单提交
    • 重定向
    • 代理

    即使你最终没有使用SimpleTest,它也可能值得一看。

    对我来说,最有用的是测试表单提交,包括GET或POST请求中的每个参数,这些参数是您站点操作所必需的每个表单。

    无论您是想测试大量的用户界面,还是只测试小的关键区域,都取决于您自己。

        3
  •  0
  •   apelliciari    16 年前

    我不知道我的答案是否有帮助,因为我也有同样的问题。

    不管怎样,如果你还没做,试试看 Windmill ,我发现非常有用,快速和肮脏,并在主要浏览器中工作。

    更改链接不会更改测试(在大多数情况下,我认为)=)

        4
  •  0
  •   thomasrutter    16 年前

    试试seleniumhq.org。

    这是一个浏览器扩展,允许您像宏一样记录单击、键入和鼠标移动等。宏可以保存为测试并回放,以便测试Web应用程序。

    看起来他们也有其他版本的产品,可以通过启动其他浏览器来执行测试。