没有银弹 - 防故障系统
在软件开发过程中,无法保证程序的正确性。然而,通过有效的软件测试,可以交付更高质量的软件,让用户更加满意,维护成本更低,结果更加精确和可靠。
如果你是牙膏制造商,你不必担心它是否有效,但软件开发者却不能对自己的软件充满信心。像其他开发者一样,我只能希望第二天它不会崩溃,但这几乎从未发生过。
除非我们开始测试,否则软件部署后总有可能出现故障。在大型软件同时开发和维护的情况下,自动化测试和持续集成就来拯救我们。在测试自动化中,单元测试是一种技术,可以将系统中的错误减少到零,证明这是一个银弹,无论是否有银。
什么是单元测试?
在更广泛的层面上,我可以这样说,单元测试是对某些功能、区域或单元进行测试的过程。这使我们能够确保我们的代码/单元做它应该做的事情。单元通过使用测试程序为每个组件提供输入并检查输出来进行测试。
测试是许多事情,但最重要的是它不是证明错误不存在的过程。它只是为软件产品增加价值。增加价值意味着提高程序的质量或可靠性。
总结一下,单元测试是将一段代码从系统中隔离出来并找出其中的错误的过程,需要注意的是,这并不等同于证明没有错误。
这样做值得吗?
当然,编写测试来测试代码是一个额外的负担,但它有许多优势,不能轻易忽略。
-
在开发初期就进行单元测试,可以让我们避免很多麻烦。它提供了早期的合理性检查。
-
单元测试允许您快速对代码进行重大更改。由于您已运行测试,知道它现在工作正常,当您进行所需更改时,您需要再次让测试工作。这种回归测试有助于避免未来的错误。
-
好的单元测试可以帮助文档化和定义某个东西应该做什么。可以通过查阅写得好的单元测试,快速了解那块代码的工作方式。
-
最后,在编写代码之前编写测试是实现功能的另一种方法。当需求明确但实现程序不明确时,测试驱动开发(TDD)是使用单元测试的一个很好的方法。
所以,为了回答这个问题,单元测试通常值得付出努力,但我们需要投入多少努力,是一个权衡取舍的问题。
如何做?
现在具体讨论测试PHP代码,我们需要一个第三方库,比如PHPUnit,它实际上会使用其API执行我们编写的测试。PHPUnit是编写测试的强大工具,可以与您选择的集成开发环境(IDE)集成,例如PhpStorm、Eclipse、NetBeans等。虽然并非总是需要在IDE中使用PHPUnit,但您可以在命令行界面(CLI)中使用它,但如果您想跟踪测试的执行,则需要IDE。
以下文本都是关于CLI环境下的PHPUnit。GitHub还使用Travis-CI在每次提交或拉取请求时运行完整的测试套件,这是Joomla目前使用的。
创建测试用例
在单元测试中,我们可以使用黑盒测试和白盒测试技术创建测试用例。一个测试用例包含具体的4个部分:-前提条件、输入、预期输出、后置条件。在制定测试用例后,现在只需要在PHPUnit测试用例中编写即可。
类Foo中方法bar()的测试用例的基本框架如下:
<?php class FooTest extends PHPUnit_Framework_TestCase { public function setUp(){ //Setting up precondition common to all test cases } public function testBar() { //Setting up precondition specific to this test case
// Assert statements goes here for example $foo = new Foo; $this->assertEquals($foo.bar($inputs), $expectedOutput);
//Setting up postcondition specific to this test case } public function tearDown(){ //Setting up post condition common to all test cases } } ?>
运行测试用例
如果PHPUnit已在CLI环境中设置,则要运行测试,您只需运行命令phpunit <测试用例路径>。
例如:如果FooTest位于当前工作目录中,则`phpunit Footest`将执行此操作。
Joomla框架的情况
目前在框架中,我们总共有39个包,包括测试辅助包。每个包都实现了使用PHPUnit的测试套件,唯一的例外是Compat包和测试辅助包。
要运行包中的测试,需要预先设置phpunit环境。例如,要运行Filesystem包的测试,请按照以下步骤操作
- 从GitHub托管在https://github.com/joomla-framework/filesystem的git仓库中获取一个副本,可以通过克隆它或下载并解压缩zip存档。
- 将当前目录更改到您刚刚克隆/解压缩的包仓库所在的目录。
- 初始化composer一次,以解决所有依赖关系并安装自动加载器。
- 通过在CLI中运行命令`phpunit`一次执行所有测试。
有两个包,表单包和加密包,它们的测试失败是因为自动加载问题,这将在下一个主要版本(即2.0)中解决。其他一些包的测试覆盖率较低,但其他包的覆盖率超过70%。
总的来说,Joomla框架状况良好,但我们可以通过在改进某些包的测试套件和修复失败的构建包上付出一些努力,使其变得更好。
在GSoC项目“框架单元测试”中,您可以期待我对每个包的测试套件进行真正的改进。我不仅会关注代码覆盖率低的包,还会审查我们现在拥有的现有测试。
是的,代码覆盖率是衡量测试套件的重要参数,但它并不是唯一衡量测试质量或必要性的标准。我的工作流程将是:选取一个包,研究其现有测试,如果可能的话进行改进,并为公共接口(即可测试的代码)添加新测试。
在 Joomla 社区杂志上发表的一些文章代表了作者在特定主题上的个人观点或经验,可能并不与 Joomla 项目官方立场一致。
通过接受,您将访问 https://magazine.joomla.net.cn/ 外部第三方提供的服务
评论