PHPUnit 排除 Getters 和 setter
PHPUnit Exclude Getters & setters
我听说有些人会测试它们,有些人不会。你什么时候对 getter/setter 进行单元测试?
如果我想跳过单元测试 getter 和 setter,我将如何使用 PHPUnit 进行管理(跳过所有 getter 和 setter)?
这真的取决于你在那些 setter 和 getter 中有什么,但对我来说,测试它们真的很有意义,即使它们像设置 private/protected 属性 一样简单。
您的程序在给定特定输入的情况下具有 expected/desired 行为,并且单元测试确保不会出现回归问题。
例如,给定一个带有具体 setters/getters 的 class,您可能会想复制粘贴一些方法,而您可能只是忘记更改其中的 属性 名称以相同值的 2 个不同设置器结尾的设置器的数量:
class User
{
private $firstName;
private $lastName;
public function setFirstName($value)
{
$this->firstName = $value;
}
public function getFirstName()
{
return $this->firstName;
}
public function setLastName($value)
{
$this->firstName = $value;
}
public function getLastName()
{
return $this->lastName;
}
}
你的测试可能是这样的
public function testSetLastName_validValue_successful()
{
$user = new User;
$value = 'Doe';
$user->setLastName($value);
$this->assertEquals($value, $user->getLastName());
}
这将立即显示 setLastName
中的错误,这是 TDD 如何提供帮助的一个很好的例子:)
为每个 setter/getter 对编写一些非常简单的单元测试将使您免于一些烦恼。
即使在使用重载时,单元测试也有助于确保魔法域setters/getters。
至于'how to skip all getters and setters' ...只是不为他们编写测试?
测试包含业务逻辑的方法。 setter 通常只是一个赋值,getter 大多数时候只是 returns 对象的 属性,或者有时是硬编码常量。结对编程和代码审查期间的目视检查应该是这些方法所需的全部测试。
PHPUnit 不测试任何东西。它只是一个帮助您编写测试和 运行 测试的工具。您编写测试,您决定在每个测试中测试什么方法。
如果您关于 including/excluding 方法的问题是关于代码覆盖率的,那么恕我直言,您走错了路。代码覆盖率本身并不是目标,也不会显示任何内容。很容易拥有 100% 的代码覆盖率和一个成功的测试套件,但实际上并没有测试代码。
制定一个目标,编写描述代码行为的测试。不要对必需的对象属性使用 setters;添加初始化对象所需的构造函数参数。仅对可选属性使用 setters。根据需要使用尽可能少的 getters。将特定于对象的行为封装在它的方法中,不要像使用数组那样使用对象(只是为了存储值)。
我听说有些人会测试它们,有些人不会。你什么时候对 getter/setter 进行单元测试?
如果我想跳过单元测试 getter 和 setter,我将如何使用 PHPUnit 进行管理(跳过所有 getter 和 setter)?
这真的取决于你在那些 setter 和 getter 中有什么,但对我来说,测试它们真的很有意义,即使它们像设置 private/protected 属性 一样简单。
您的程序在给定特定输入的情况下具有 expected/desired 行为,并且单元测试确保不会出现回归问题。
例如,给定一个带有具体 setters/getters 的 class,您可能会想复制粘贴一些方法,而您可能只是忘记更改其中的 属性 名称以相同值的 2 个不同设置器结尾的设置器的数量:
class User
{
private $firstName;
private $lastName;
public function setFirstName($value)
{
$this->firstName = $value;
}
public function getFirstName()
{
return $this->firstName;
}
public function setLastName($value)
{
$this->firstName = $value;
}
public function getLastName()
{
return $this->lastName;
}
}
你的测试可能是这样的
public function testSetLastName_validValue_successful()
{
$user = new User;
$value = 'Doe';
$user->setLastName($value);
$this->assertEquals($value, $user->getLastName());
}
这将立即显示 setLastName
中的错误,这是 TDD 如何提供帮助的一个很好的例子:)
为每个 setter/getter 对编写一些非常简单的单元测试将使您免于一些烦恼。
即使在使用重载时,单元测试也有助于确保魔法域setters/getters。
至于'how to skip all getters and setters' ...只是不为他们编写测试?
测试包含业务逻辑的方法。 setter 通常只是一个赋值,getter 大多数时候只是 returns 对象的 属性,或者有时是硬编码常量。结对编程和代码审查期间的目视检查应该是这些方法所需的全部测试。
PHPUnit 不测试任何东西。它只是一个帮助您编写测试和 运行 测试的工具。您编写测试,您决定在每个测试中测试什么方法。
如果您关于 including/excluding 方法的问题是关于代码覆盖率的,那么恕我直言,您走错了路。代码覆盖率本身并不是目标,也不会显示任何内容。很容易拥有 100% 的代码覆盖率和一个成功的测试套件,但实际上并没有测试代码。
制定一个目标,编写描述代码行为的测试。不要对必需的对象属性使用 setters;添加初始化对象所需的构造函数参数。仅对可选属性使用 setters。根据需要使用尽可能少的 getters。将特定于对象的行为封装在它的方法中,不要像使用数组那样使用对象(只是为了存储值)。