Python
PHP
test
Laravel
YYPHP

YYPHP#58「PHP上達の近道、テストってどうやってる?タスク管理について(LT)、45歳からはじめるPHPプログラミングどうやって関数からクラスにしていくの?」

これは2018年10月26日に開催したPHPerイベントYYPHP#58のイベントレポートです。

YYPHPは一言で「PHPerの部室」です。PHPについて、雑に、ゆるく、ワイワイ話し合う集いです。毎回お題を決めずに雑談を出発点にいろいろなことを突発的にやります。集まった人でコードリーディングをすることもあれば、一緒に開発ツールを触ってみたり、フレームワークについての情報交換をすることもあります。開催はほぼ毎週、高田馬場にて。


サブタイトル: PHPerを支える技術たち

YouTubeでの配信映像はこちら-> #YYPHP #58【PHPの情報交換・ワイワイ話そう・仲間作り・ゆるめ・にぎやかめ】


参加者10名(うちリモート3名)


  • PHP歴


    • 1年未満: 3名

    • 1年: 1名

    • 6年: 2名

    • 10年以上: 3名

    • 不明: 1名




今日の雑談


PHP上達の近道


テストってどうやってる?


  • アンケート


    • PHPでテストやってことがある人 => 3人



  • どういうテストをやろうとしている?


    • テストがどういうものかまだわからっていない

    • 単体とかユニットとかある



  • PHPUnitで単体テストや結合テストをやっている

  • 画面のテストは変わりやすい時期はまだやらないか、やる範囲を変わりにくいところに絞ったほうが良い

  • コードカバレッジで100%を目指すのは良くない


    • PHPはコンパイル言語じゃないので、どれだけ書くか分からないので

    • カバレッジは設計が良くないと高められない


      • 設計

      • クラス

      • 何十もif文が入ってるとかだとテストできない場合も

      • インフラと密結合になっているとテストが難しく、できない場合がある





  • CI(自動テスト)でコードのチェックもさせる

  • レガシー


    • 1ページ1PHPファイルになっている


      • Viewとロジックがごっちゃになっている



    • クラスに切り出したときに単体テストを増やしていく

    • これだけは動かないといけないというところはSeleniumで自動テストを書いて安全性を確保した上で、単体テストを追加していく



  • PHPUnitを3〜4年くらい前にやってみたが全くわからなかった



<?php

// PHPUnitっぽいやつ
abstract class TestCase
{
public fucnction assertTrue($expression): void
{
if (!$expression) {
throw new RuntimeException('dame');
}
}
}

// 作った足し算プログラム (これがテスト対象)
class Sum
{
public function sum($x, $y): int
{
return $x + $y;
}
}

// 作った足し算プログラムをチェックするプログラム
class SumTest extends TestCase
{
public function testSum(): void
{
$sum = new Sum();
$this->assertTrue($sum->sum(1, 1) === 2);
}

/**
* パラメタライズド テスティング
* `@dataProvider`アノテーションはPHPUnitの機能
* @dataProvider testData
*/

public function testSum2($a, $b, $expected)
{
$sum = new Sum();
$this->assertTrue($sum->sum($a, $b) === $expected);
}

// パラメタをまとめる
public function testData()
{
yield [1, 1, 2];
yield [1, 2, 3];
yield [100, 100, 200];
// ...
}
}

$test = new SumTest();
$test->testSum();


タスク管理について (yuk_hik_futureさんからのLT)



  • 発表スライド:




  • オライリー『エンジニアのための時間管理術』まとめ



  • わりこみ作業の多いSA(システム管理者)向け


  • 割り込み作業の処理、タスク管理、時間管理などについて


  • バックログにタスクが増え続ける状態になってた



  • 「サイクルシステム」


    • 約束のカレンダー

    • 今日のスケジュール

    • 1日ごとのTODO

    • 目標管理



  • プライベートでもできる限り同じツールを使う



  • カレンダーに書くべきこと


    • アポイントメントと会議

    • 重要な納期

    • 将来の作業目標

    • 発生したその場で登録したほうがいい




  • 今日のスケジュール作成


    • カレンダーアプリで見れるやつを使う




  • 1日毎のTODO管理


    • 優先順位が3段階である理由


      • 100段階はだめだった





  • 以下、発表を聞いてのディスカッション



  • 自分の見積もった時間内に終わらせる努力も大事


    • 完成度が70%や80%(クオリティーや機能を減らして)でも、その時間内に終わったことにする


      • そうしないとずるずる翌日に伸びていく






  • デイリーのレビューが必要


    • タスクがInboxに増え続けるので、やめるのか移譲するのかをデイリーのレビューで管理する




45歳からはじめるPHPプログラミング


どうやって関数からクラスにしていくの?


  • 関数を複数使った処理を書いたが、これをどうやってクラスにしていくかわからない。どうやるの?

  • 関数をクラスの中に入れていくとクラスになる

  • 大事なデータはクラスのプロパティ


    • 複数の関数に関わっている変数はプロパティ



<?php

class MemberInfo
{
/**
* @var DomDocument
*/

private $dom;

public function __construct(DomDocument $dom)
{
$this->dom = $dom;
}

public function getMembers(): array
{
$list = $this->dom["#main > div.applicant_area > div:nth-child(3)"]->find(".display_name")->text();
return $list;
}

public function getMemberDetail()
{
$this->dom;
}
}

$memberInfo = new MemberInfo(new DomDocument('html'));
$members = $memberInfo->getMembers();


  • 具象をいろいろ見て、抽象化を考える

  • 妄想力を鍛えるw

この関数は3つやっていることがある

やることは1つにすべき

<?php

declare(strict_types=1);

/* HTMLが読み込めたかどうかをチェック */
function check_html(bool $html): bool {
if ($html === false) { // 役割3 判定
echo '$html is empty. Please chech your URL.' . "\n"; // 役割1 出力
exit(1); // 役割2 プログラムの終了
}
return true;
}

boolvalで変換するとかできる

    if ($var <> null) {

if ($var != null) { // 暗黙の型変換が走る
if (is_null($var)) {
if ($var !== null) { // 暗黙の型変換が走らない


YYPHPは毎週やってます

PHPについてワイワイ話したい方は、YYPHPのイベント情報をチェックしてみて下さい。

以上、YYPHPのレポートでした。次回もワイワイやっていきたいと思います! では、また来週!