03. Unit Test x PHPUnit x FizzBuzz

Fizz Buzz 是个小朋友的游戏,小朋友们依序报数,但当遇到三的倍数要喊 fizz、五的倍数喊 fuzz,遇到既是三也是五的倍数要喊 fizzbuzz。

有人小时候玩过吗?我想这个游戏应该在成年人间比较流行(以面试题的型式)...

来玩 FizzBuzz ㄅ

Unit Test

好的这位大朋友,让我们...打开 tests/Unit 资料夹,一起用单元测试来玩...

tests/Unit 里面有一个内建的 ExampleTest 档案。
assertTrue() 会检查传入的参数是否是 true,是则回传 true。

<?php

namespace Tests\\Unit;

use PHPUnit\\Framework\\TestCase;
use App\\My\\Service\\TestService;

class ExampleTest extends TestCase
{
    public function testSomethingIsTrue()
    {
        $this->assertTrue(true);
    }
}

这位大朋友您别急,我们再学一个 assertSame(),这个函式会检查传入的两个参数是否是相等,是则回传 true。
下面是我写了一个会回传输入的函式,然後用 assertSame 检查。

public function testSomethingIsTrue()
{
    $input = "1";
    $output = $this->fizzbuzz($input);
    $this->assertSame($input,$output);
}

private function fizzbuzz($input) {
    return $input;
}

接下来我们需要一个可以自动输测资的工具。
在 test function 上加上 @dataProvider 可以透过连结的函式喂入参数。
我们把游戏规则写进去ㄅ。

 /**
 * @dataProvider data
 */
public function testSomethingIsTrue($input, $expect)
{
    $output = $this->fizzbuzz($input);
    $this->assertSame($output, $expect);
}

public function data()
{
    return [
        [ "1", "1" ],
        [ "3", "fizz" ],
        [ "5", "buzz" ],
        [ "15", "fizzbuzz" ]
    ];
}

private function fizzbuzz($input) {
    return $input;
}

终於等到红灯了 ^_^

https://ithelp.ithome.com.tw/upload/images/20210917/201397453dIpXXkX5m.jpg

接下来要做的就是把 fizzbuzz 函式改对。

private function fizzbuzz($input) {

    $input = (int) $input;

    if( $input % 15 == 0 ){
        return 'fizzbuzz';
    }

    if( $input % 3 == 0 ){
        return 'fizz';
    }

    if( $input % 5 == 0 ){
        return 'buzz';
    }

    return (string) $input;

}

搭拉!

参考
https://phpunit.readthedocs.io/en/9.5/writing-tests-for-phpunit.html

AAA pattern

在这个范例里,我们使用到了 3A 原则,也就是 Arrange-Act-Assert

Arrange = 准备受测物件、参数、预期结果
Act = 执行受测方法
Assert = 验证执行结果与预测结果是否一致

我们在 data provider 准备测资,执行 fizzbuzz 函式,assert 验证结果。

红灯、绿灯、重构

流程上,有使用到 TDD 的部分概念。
我们先写游戏规则,再来改写函式。

这样对工程师方便的地方是我们在开发时很清楚什麽时候可以跟 PM 说「我写完啦」,不必担心有什麽没考虑到。

另一点,我们把游戏规则白纸黑字的写下来放进程序码版空了,日後如果没时间补文件,至少我们还有测试程序可以参考。

听起来很棒,为什麽有人不这麽做呢?

最常见的情况是需求太常变动,或是没有能列规格的 PM。
才刚通过了测试,验收的人又觉得要改一改、补一补,这种情况下的测试程序就失去了意义。


<<:  Endpoint

>>:  [iT铁人赛Day18]JAVA的函数(下篇)

DAY2 序

第一页、第六页、第七页 序。 序放在第一页後面也是完全OKです! 因为第一天讲太多废话了,完全没有讲...

证照制度:专业分工时代的基石

下载2021年学习成长-PMI证照分享投影片 ...

Day 26 讨论 AI 深度学习论点

大家好~~欢迎来到第二十六篇 聊聊 AI 相关论点 本篇呢,来跟大家分享之前本人有做过一个跟车子有关...

Day 23 : Linux - 如何在Ubuntu的英文介面下使用新酷音中文输入法?

如标题,如果你突然想不开,想将Ubuntu下载成英文版的,那你一定会头疼该如何输入中文 因为英文介面...

【JavaScript】 日期转换为 年/月/日 字串

JavaScript 有许多处理日期的方法,toLocaleDateString() 可以将日期的标...