使用Laravel进行单元测试

5
我正在使用Laravel 5.5框架的PHP。我最近开始为我的代码编写单元测试,有一些问题需要解决:
  1. 与数据库交互的最佳方法是什么?应该使用像SQLite这样的InMemoryDB还是使用Mockery模拟所有内容。

  2. 如果我与数据库进行交互,那么这仍然是单元测试还是集成测试?

感谢提前回答。

1
数据库测试不是单元测试。你提出的问题是一个相当广泛的话题。既然你问了这样的问题,说明你对测试并不了解,很有可能你的代码编写方式不适合进行单元测试。 - Mike Doe
我刚开始深入研究单元测试,所以我的代码可能无法进行测试...不管怎样,感谢您的澄清。 - user9244658
阅读Laravel测试文档,它解释了单元测试和功能测试之间的区别。 - Zoe Edwards
1个回答

0

我在一家公司工作,我们力求代码覆盖率达到80%,通常我们主要进行端到端测试,包括数据库和模拟外部调用,我们使用SQLite,以便我们的测试套件可以在本地环境中快速运行。如果情况合理,我们会进行单元测试,例如我为不同国家编写的税务服务就进行了单元测试,因为它非常基于输入输出。

为什么我们更喜欢端到端测试:

  • 如果您不必进行单元测试、集成测试和端到端测试,则速度更快
  • 您测试的是实际将要使用的终端点
  • 如果您正在运行连续集成,我更喜欢使用真实数据库

SQLite存在缺点,主要是它与其他关系型数据库不同,没有很多设置和限制,我曾经遇到过外键强制执行等问题。

所以回答你的问题:

  • 至少在本地使用SQLite是明智的选择
  • 在单元测试中,您只测试一个类并模拟其他所有内容,基本上您测试的是代码是否能够执行。请注意,这是一个非常复杂的主题的简化版本。

旁注:我最初在测试时使用了SQLite,但由于数据库引擎的差异,这被证明不适合长期使用。 - online Thomas
马丁曾听说过测试金字塔吗?代码覆盖率应该只在进行单元测试时进行测量,而在进行端到端测试时应忽略。 - Mike Doe
是的,但是按照Laravel开发的方式,这是人们喜欢的方式,也是我喜欢的方式。根据我的经验,大多数公司都会忽略测试或者根本不进行测试。在我们的部门中,我们曾经在一些非常依赖单元测试的公司工作过,有时候感觉有点过头了,而且你可能会错过一些东西。在Laravel中,测试框架的结构可以让你使用应用程序的测试实例进行端到端测试。所以当我谈论端到端测试时,需要说明我只从事API开发。 - mrhn
1
@Thomas 我们的团队也遇到了同样的问题,但我们付出了很大的努力来支持它,因为我们可以节省在本地运行测试和快速测试所需的时间,这甚至是 Uncle Bob 推广的东西 :) - mrhn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接