Symfony 实体类的单元测试





0/5 (0投票)
Symfony 实体类的单元测试
引言
为您的 Symfony Entity (Doctrine) 类编写单元测试是一个好主意,这些类是您 Symfony 项目的一部分。 在本文中,我将展示我为“User
”实体创建的单元测试示例,该实体代表我在为 Taft College 创建的请愿系统中的一个用户。
创建您的测试文件
作为任何 Symfony 项目的一部分,测试用例应存储在“tests”文件夹下。 文件夹也可以在“phpunit.xml.dist”文件中的“testsuite
”标签内指定。 因此,对于一个 Entity
,一个好的文件夹路径是
tests\AppBundle\Entity
然后,在我的例子中,我在上面的文件夹下创建了“UserTest.php”文件。
测试用例文件
所有 PHPUnit
测试类都应扩展“PHPUnit\Framework\TestCase”; 因此,要启动一个最小的文件,它将包含以下内容
// tests/AppBundle/Entity/UserTest.php
namespace tests\AppBundle\Entity;
use AppBundle\Entity\User;
use PHPUnit\Framework\TestCase;
class UserTest extends TestCase{
public function testUserCreate(){
$user = new User(); // Create User object.
...
}
}
上面的代码只是创建了一个 User
对象,没有做其他任何事情。 因此,此时,我们需要查看 User
类有哪些方法,并将每个方法(如果可能)添加到我们的测试用例中。
下面是 User 实体在 Eclipse 中的大纲截图
现在让我们测试 setUserName
方法,并使用 getUserName
进行验证,所以我添加了如下测试代码
public function testUserCreate(){
$user = new User(); // Create User object.
$user->setUserName("Name");
$this->assertEquals("Name", $user->getUserName());
}
所以接下来,让我们测试一下,看看一切是否正常工作,并且我们走在正确的轨道上。
运行 PHPUnit
在 Symfony 的当前版本中,您需要从 Symfony 项目的顶级目录使用以下命令运行 PHPUnit
./vendor/bin/phpunit
仅凭该命令本身用处不大。 我建议使用覆盖率,并仅指定我们创建的单个测试用例,因为我们只想验证这个测试用例是否正常工作。 如果您收到太多的错误/调试消息,将很难进行故障排除。 因此,要仅运行上面的测试用例文件并查看覆盖率,请使用以下命令
./vendor/bin/phpunit --coverage-text tests/AppBundle/Entity/UserTest.php
当上面的命令运行时(通常情况下),它会显示 PHPUnit
的版本、测试/断言的数量,以及用颜色表示的覆盖率(绿色代表良好)。 下面是结果(正常)的截图
此结果表明 User
类的 15 个方法中有 3 个已被调用,这还不够多。 对于测试用例,如果可能,我们需要争取 100% 的方法测试。
最终测试用例
我最终创建了两个测试用例,因为在我在创建的应用程序中,一个 User
需要添加签名,因此将此拆分为第二个测试用例来将签名添加到 User
中非常重要。 这仍然测试 User
的功能。
这是创建 User
的完成的测试用例
public function testUserCreate(){
$user = new User(); // Create User object.
$user->setUserName("Name");
$user->setUserType("Advisor");
$user->setFosUsername("FOS");
$user->setDivision("DIV");
$user->setDivAlt("DIV_ALT");
$sig = new Signature(); // Create a signature.
$sig->setSigType("Advisor_Submit");
$date = date("Y-m-d H:i:s", strtotime('2018-12-31 09:20:35'));
$sig->setSigDate( $date );
$user->addSignature( $sig );
$this->assertEquals("Name", $user->getUserName());
$this->assertEquals("Advisor", $user->getUserType());
$this->assertEquals("FOS", $user->getFosUsername());
$this->assertEquals("DIV", $user->getDivision());
$this->assertEquals("DIV_ALT", $user->getDivAlt());
$this->assertEquals(null, $user->getUserId());
$sigCollection = $user->getUSignatures();
$this->assertEquals($date, $sigCollection->last()->getSigDate());
$user->removeUSignature( $sig ); // Remove the signature.
$sigCollection = $user->getUSignatures();
$this->assertEquals(true, $sigCollection->isEmpty());
}
这是测试将签名添加到用户完成的测试用例
public function testAddSignature(){
$user = new User(); // Create User object.
$user->setUserType("Advisor");
$sig = new Signature();
$sig->setSigType("Advisor_Submit");
$date = date("Y-m-d H:i:s", strtotime('2018-12-31 09:20:35'));
$sig->setSigDate( $date );
$sig->setRecommend("yes");
$sig->setSigExplain("sig_explanation");
$sig->setUser( $user );
$sig->setNotes("some_Notes");
$user->addSignature($sig);
$sigs = $user->getUSignatures();
$this->assertNotEmpty($sigs);
foreach ($sigs as $s){
$this->assertEquals("Advisor_Submit", $s->getSigType());
$this->assertEquals($date, $s->getSigDate());
$this->assertEquals("yes", $s->getRecommend());
$this->assertEquals("sig_explanation", $s->getSigExplain());
$this->assertEquals($user, $s->getUser());
$this->assertEquals("some_Notes", $s->getNotes());
$this->assertEquals(null, $s->getSigId());
}
$sig->removeUser( $user );
$s2 = $user->getUSignatures();
$this->assertEmpty($s2);
}
注意:在创建添加签名的测试用例时,我意识到我不能简单地使用方法 setUser
(null
) 来删除一个 User
; 因此,我不得不添加一个名为“removeUser
”的方法,该方法可以正确地删除 User
。 有时,您在审查代码和创建测试用例时可能需要这样做。
在添加所有方法的测试用例后,结果输出如下
尽情享用!