2016-02-12 100 views
3

PHPUnit manual亮点的一些约定:PHPUnit的测试套件命名约定

  • 一类MyClass试验进入一类MyClassTest
  • MyClassTest住在文件MyClassTest.php
  • MyClassTest继承PHPUnit_Framework_TestCase
  • 测试是公共方法,被命名为test*

这将导致这样的文件夹结构:

├── src/ 
│ ├── classes/ 
│ │ ├── MyClass.php # Different 
│ └── ... 
├── tests/ 
│ ├── testcases/ 
│ │ ├── MyClassTest.php # Different 
│ ├── bootstrap.php 
│ └── ... 
└── ... 

...这测试用例:

MyClassTest extends PHPUnit_Framework_TestCase { 

    testMyMethod() { 
     // Code here. 
    } 
} 

我的问题

我想知道是否有是什么原因为什么在测试套件中使用的命名不能反映项目的源代码?例如,我想文件名可以匹配:

├── src/ 
│ ├── classes/ 
│ │ ├── MyClass.php # Same 
│ └── ... 
├── tests/ 
│ ├── testcases/ 
│ │ ├── MyClass.php # Same 
│ ├── bootstrap.php 
│ └── ... 
└── ... 

如果使用PHP> 5.3,命名空间可用于允许类名匹配:

namespace MyProject\MyTests; 

MyClass extends PHPUnit_Framework_TestCase { # The class name MyClass matches the class name used in my project's source. 

    /** 
    * @test 
    */ 
    MyMethod() { # The method name MyMethod matches the method name used in my project's source. 
     // Code here. 
    } 
} 

注意@tests注解用于所以方法名称可以匹配。

+0

原因是**约定**。与例如camelcase的类名。没有什么能阻止你根据你的意愿命名你的测试类。对于其他开发者来说,这可能看起来很奇怪,并且会带来相反的问题 - 为什么不遵循约定。 –

+0

感谢您的信息。我在想同样的事情,但是让我的测试完全反映我的信息来源对我来说很有意义。我的意思是,为什么命名测试方法和测试方法的方式不同,如果可以将它们命名为相同的? – henrywright

+0

这是一个略有不同的修辞问题。 * convention *之一是公开预期结果,例如'testMyMethodDoesTheStuff()' –

回答

0

如果使用PHP> 5.3,命名空间可用于允许类名匹配:

还有理由不这样做:

  • 它很有意义的测试和在同一命名空间中的待测类
  • 否则,您需要使用类别别名来导入测试中的类,以将其与测试用例区分开来:

    use MyProject\MyClass as MyActualClass; 
    

方法名匹配的MyMethod在我的项目的源代码中使用的方法名。

,如果你认为的testMyMethod作为替代这听起来吸引人,但这并不公约。相反,您应该使用更多描述性测试方法名称,如testThatMyMethodReturnsTrueIfFooIsBar

+0

关于你提到的第二个点(使用像'testThatMyMethodReturnsTrueIfFooIsBar'方法名),是因为你可能对每个被测方法不止一个测试方法是什么?例如'testThatMyMethodReturnsTrueIfFooIsBar'和'testThatMyMethodDoesSomethingElse' – henrywright

+0

是的,通常你将有一个测试方法,为“幸福路径”和一个或更多预期错误 –