我是PHPUnit的新手,事实上我今天开始了。而且,据我所读,我开始只了解这个脚本的作用。
class UserTest extends PHPUnit_Framework_TestCase
{
protected $user;
// test the talk method
protected function setUp() {
$this->user = new User();
$this->user->setName("Tom");
}
protected function tearDown() {
unset($this->user);
}
public function testTalk() {
$expected = "Hello world!";
$actual = $this->user->talk();
$this->assertEquals($expected, $actual);
}
}
对于这堂课:
<?php
class User {
protected $name;
public function getName() {
return $this->name;
}
public function setName($name) {
$this->name = $name;
}
public function talk() {
return "Hello world!";
}
}
好的,所以我已经确定测试会根据测试的相等性返回Ok / Fail语句,但是我正在寻找的更多。我需要一种实际的方法来测试一个更复杂的类,它的结果,在这个例子中不喜欢,不能轻易猜到。
说,我写了一个执行轮询的脚本。如果方法/类可以工作,我将如何测试或以何种方式测试?上面的代码只显示方法结果是否只有'Hello World'
但是,这很容易测试,因为我需要测试复杂的东西,并没有太多的教程。
答案 0 :(得分:7)
在单元测试中测试类应该不复杂。
这样做的原因是,在设计良好的系统中,您可以单独测试该类,并且不会在该类后面添加系统的复杂性 - 因为在测试期间该系统不存在,它被嘲笑了。
这方面的经典示例是User类通常会向数据库询问信息,但在测试用例中,该数据库实际上很难设置,准备数据并在之后销毁。使用真实数据库也会降低速度。因此,您将User类设计为从外部接受数据库对象,并在测试用例中为其提供数据库的模拟对象。
这样,从数据库中模拟各种返回值非常简单,另外,您可以检查数据库对象是否获得正确的参数,而无需处理真实数据库的复杂性。
如果您的类设计为允许依赖注入,则只能执行正确的模拟对象注入。这是一个原则,不在其他对象内创建对象,但需要外部世界提供它们。只需快速浏览一些视频即可获得解释:
请记住,创建好的测试需要一些经验。很适合你开始试验。
答案 1 :(得分:2)
但是,这很容易测试,因为我需要测试复杂的东西,并没有太多的教程。
测试越复杂,越复杂。这有点像蛇咬自己的结局。您通常希望防止这种情况,因此要做到这一点:编写简单的测试以确保测试并运行复杂的软件。
这并不总是100%有效,但它比没有测试更好。 PHPUnit专为单元测试(Xunit test patterns)而设计,但您也可以使用它来运行不同的测试。为此你分组测试。不同的人根据不同的事情做不同的事情。例如:
或(不等同于):
或(或许等效TestPyramid):
什么不是。当你开始测试时,从单元测试开始并作为Sven already answered开始可能很好,保持简单。熟悉TDD,阅读一些幻灯片和书籍。欢迎来到自动化测试的世界。
P.S。是的,简单的getter setter太容易测试了。如果所有的setter都存储到私有成员并且getter将其恢复,那么你可以相信PHP正在工作,为此编写测试是浪费时间并且只会导致失败。它清楚地表明有人在编写代码后编写了测试。而是首先编写测试并看到它失败(红色),然后尽可能快地将代码混合在一起以使测试通过(绿色)。您可以稍后在上改进代码,因为测试已经显示它正在运行。