PHPUnit单元测试中类protected/private方法测试

这里首先有一个问题要考虑的是,这类方法是否要被测试?

理论上,这类方法都会被其它public类型的方法调用,只要对那些public的方法做充分的测试,就可以保证这些方法的可靠性,就没有必要再测了。好像是有道理的。

我们先看看好的单元测试的原则:(ATRIP)

  • 自动化(Automatic)
  • 彻底(Thorough )
  • 可重复(Repeatable)
  • 独立(Independent )
  • 专业(Professional)

对于测试private/protected方法来说,有另外三个附加原则:

  • 透明(Transparency) - 不要改变测试下的系统(System Under Test ,SUT),例如,在产品代码中增加包装的方法.
  • 范围(Scope) - 可以在Debug和Release下运行
  • 简单(Simplicity) -最小的开销,因此容易修改,并且非常简单引入最小的风险.

正常情况下,PHP中只有标记为public的方法和属性,才可以在外部被访问,而protected/private方法都无法直接访问。

对于protected的,简单的方法是:通过创建一个子类并增加一个public的方法来包裹该protected的方法,即可通过这个子类的public方法来测试。

对于private的方法,则只能利用PHP的反射特性去访问,protected的方法同样也可以用反射实现访问。PHPUnit中其实在Mock Objects部分就充分使用了该特性来拦截某些方法的返回值,以完成复杂场景的测试。

PHPUnitPHP 的一个测试框架,支持单元测试、集成测试和功能测试。对于接口测试,可以使用 PHPUnit 的 HTTP 测试工具来模拟 HTTP 请求,并进行断言验证。以下是一个简单的示例: ```php use PHPUnit\Framework\TestCase; use GuzzleHttp\Client; class ApiTest extends TestCase { private $client; protected function setUp(): void { $this->client = new Client([ 'base_uri' => 'http://example.com/api/', 'timeout' => 2.0, ]); } public function testGetUser() { $response = $this->client->request('GET', 'user/1'); $this->assertEquals(200, $response->getStatusCode()); $this->assertJson($response->getBody()); } public function testCreateUser() { $response = $this->client->request('POST', 'user', [ 'form_params' => [ 'name' => 'John Doe', 'email' => 'john@example.com', ], ]); $this->assertEquals(201, $response->getStatusCode()); $this->assertJson($response->getBody()); $data = json_decode($response->getBody(), true); $this->assertArrayHasKey('id', $data); $this->assertEquals('John Doe', $data['name']); $this->assertEquals('john@example.com', $data['email']); } } ``` 在上面的示例中,我们使用 GuzzleHttp 客户端来发送 HTTP 请求并接收响应。我们在 setUp 方法中创建客户端实例,并设置了基本的 URI 和超时时间。然后,我们定义了两个测试方法,testGetUser 和 testCreateUser,来测试 GET 和 POST 接口。在每个测试方法中,我们使用 `$this->client->request()` 方法发送请求,并使用 PHPUnit 的断言来验证响应状态码和响应体的 JSON 格式、具体数据等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值