一个简单的问题:如何区分功能测试、单元测试和集成测试?
有很多不同的观点,但我特别想确定如何组织一个涉及模型关系的 Laravel 测试。这里有一个需要测试的 PHP 代码示例:
据我所理解的测试描述(请随时纠正我): 单元测试 - 测试代码的最小部分 - 不涉及数据库 - 不与系统的任何其他部分交互 集成测试 - 测试系统的部分协同工作 - 例如调用需要一起测试的帮助程序的控制器 功能测试 - 黑盒测试 - 例如调用 API 端点,查看是否返回了正确的 JSON 响应
根据这些描述,我的问题是:
- 我的 Laravel 模型测试需要测试代码的最小单元——计算访问器的模型,这使其感觉像一个单元测试。 - 但是,当它加载模型的关系时,它会触及到数据库。 - 它不像是一个集成测试,因为它只涉及其他相关模型,而不涉及内部或外部服务。 - Laravel 中的其他属性访问器测试在不涉及数据库或模型关系的情况下属于单元测试。 - 将这些类型的测试分成集成测试意味着单个模型针对其属性的测试在集成和单元测试之间被分割。 - 如果不使用模型之间的模拟,那么我的测试应该放在哪里?
答案是:这个测试应该被归类为“集成测试”,因为它与数据库发生了交互。单元测试的目的是测试代码的最小部分,而在这种情况下,模型与数据库交互,因此它不适合作为单元测试。
public function prices()
{
return $this->hasMany(Prices::class);
}
public function getPriceAttribute($)
{
return $this->prices()->first() * 2;
}
据我所理解的测试描述(请随时纠正我): 单元测试 - 测试代码的最小部分 - 不涉及数据库 - 不与系统的任何其他部分交互 集成测试 - 测试系统的部分协同工作 - 例如调用需要一起测试的帮助程序的控制器 功能测试 - 黑盒测试 - 例如调用 API 端点,查看是否返回了正确的 JSON 响应
根据这些描述,我的问题是:
- 我的 Laravel 模型测试需要测试代码的最小单元——计算访问器的模型,这使其感觉像一个单元测试。 - 但是,当它加载模型的关系时,它会触及到数据库。 - 它不像是一个集成测试,因为它只涉及其他相关模型,而不涉及内部或外部服务。 - Laravel 中的其他属性访问器测试在不涉及数据库或模型关系的情况下属于单元测试。 - 将这些类型的测试分成集成测试意味着单个模型针对其属性的测试在集成和单元测试之间被分割。 - 如果不使用模型之间的模拟,那么我的测试应该放在哪里?
答案是:这个测试应该被归类为“集成测试”,因为它与数据库发生了交互。单元测试的目的是测试代码的最小部分,而在这种情况下,模型与数据库交互,因此它不适合作为单元测试。