E2Eテストドリブン開発の実際

PlaywrightでE2Eテスト作ってからElectronアプリ作った時のエピソード

前提

プロジェクト概要

JSONデータを表で一覧したりそこから実際に作れるJSONをノーミスかつ短時間で作るため、JSONスプレッドシートの相互変換するアプリケーションを用意する

ユーザー

スプレッドシートは使えてコピペ操作など、それなりにPCを使えるノンプログラマ

開発メンバーとステークホルダー

プログラマ2 + ユーザー側1 + プロジェクトリーダーとしてスケジュール面倒見る人1

全員別人です。私はプログラマとしてカウントしています。

一応ステークホルダーとメインで話しつけたりするけど社内なんで適当にもう一人のプログラマに「ナシ付けて来い」とかやってました。

環境とテクノロ

開発もユーザーもMac PC

Electron+Typescriptで開発してパッケージにして配布する

ワークフロー

ストーリー出し→ストーリーポイント見積→イテレーションの作業決め→ストーリーごとにブランチ作成→ストーリーを達成することを確認する自動テスト作成(E2E or UT)→プルリクエスト作成、自動テストレビューしてゴールを明確にする→プロダクトコード作成→作成したテストを通す→レビュー→マージ→次のストーリーに着手

自動テストでゴールを明確にする

自動テストの最大の目的

正直ストーリー出してる時点ではゴールは明確じゃない。その場では「だよね」みたいな雰囲気出してるけど雰囲気。誰もゴールしらない。わかってないのにわかってる空気出してるか、わかってないけどわかってると思い込んでいるだけです。

自動テスト作る段階で具体的にゴールを決めて、自動テストの成功でゴールに到達していることを確認することで明確な実装完了基準を設ける

仕様変更と自動テストの変更は同時にする

主な仕様変更のタイミングはプロダクトコードの作成

コード書いて実際にE2E通してると「この動作だるくね?」ってなることがたくさんある

その時に自動テストの変更の形で「こんなんどうすか?」と案をだしたり、相談しながらお互いに自動テストコードを変えたりで、仕様変更の具体的な内容を自動テストで決めていく

当人たちの納得感えぐいし、安心感とんでもないので本当におすすめ

最初のE2Eのコツ

目的

プロトタイプのデモンストレーション

完成品のイメージをステークホルダーに見せ最初のゴールを明確にする

雑にアプリのデモを用意する

デザインとかなんも綺麗じゃない雑にテキストボックスとボタンだけ置いたUI置いて、Playwrightで雑に基本機能の動作をエミュレートしたテストを構築する

開発速度最優先。破棄前提

プロトタイプに正しい前提なんてないので

何が正しいか、何が必要かなんて開発初期にはわからないので、とにかく動くものを作って見せて「わからせる」

わからせた後にプロトタイプが流用できるかを考えれば良い

入力は直接コードに入れておく

外部化するのは面倒だし効果も薄いので

プロトタイプなんてそんなものでよい。破棄する前提

このテストは成功させ続ける

メイン機能を保証していくため

このテストが成功している限りゴールからブレていないことが明確になるので良い。安心できる

もちろんメンテナンスしてく

最初は input.value に値突っ込んでたのをコードに移したり、機能拡充でボタンとか増えた分に対応したり、 id とかつけてセレクタよくできそうなら良くしたりとか

プロダクトコードと同レベルで更新していけ

うれしいこと

スケジュールの達成度が共有しやすい

テストの成否で実装したストーリーが見えるので。

開発メンバーどうしでも「成功してんじゃん!」で和気あいあいになれる。結構いい雰囲気で開発が進められるので気分が良い

ステークホルダーについてもめっちゃ説明しやすいしいちいち動作を見せられるので納得してもらいやすい。口出しされにくいのでめっちゃ開発に集中できる

会話がしやすい

「これこうじゃね?」って自動テストコードいじりながら会話すると、自動テストコードが実質ホワイトボードになる

プログラマ同士限定だけど、コード書いてるときプログラマしかいないので問題なし。すごい快適に会話できる

ドキュメントとかを求められにくい

動くものの説得力がすごいので、「どんなん?」って言われたらテスト結果や動作を見せればいい

ドキュメント類は結局ステークホルダーの安心感のために必要とされ開発メンバーはそこまで必要としてないのが実情なので、かなり実利がある

令和のプログラミングの教え方

前提

仕事でプログラミングするにあたり現代チーム開発とTypescriptを覚えてもらう

覚えてもらう事

  • TypeScript(何らか言語)
  • プログラマの常識
    • 変数名の付け方
    • コメントの書き方
    • 美しいとされるコード など
  • 現代開発ツール
    • Git
    • GitLabやGitHubなどリモートリポジトリとチーム開発支援のツール
    • パッケージマネージャ
  • プログラミング知識の調べ方
    • 参考にすべきWebページ
    • 本の買い方
  • プロジェクト作成からビルドまでの一連の経験

Dockerとかも覚えてほしいのはそりゃそうなんだけど、詰め込み過ぎとして諦める

参考書

なんだかんだ紙本は初学者に良い。画面見ながら本広げてって流れが作れるのが良い

プログラミングTypeScript

まあオライリーで言語別の良さげな本使っとけば間違いないんじゃないすか

普通に言語知識覚えてもらうために読んでもらうのと、わからないところがあった時のリファレンスとして読んでもらう。章単位で読んでおいた方が良いところをマークしといて予習復習に使わせたり自習の時のガイドにしたりなんだかんだ本は便利。ネットだとちゃんとした情報にアクセスするの結構難しいからね

リーダブルコード

令和でも使える平成の遺物

マナーブックとして使う

良い変数名とか何を持って美しいとするのか「良いコード」とは何か、プログラマが前提としている当たり前みたいな事を学ぶのに適している

真面目な話この本以外でこういったプログラマの常識みたいな事どうやって学ぶんだろうか

覚えてもらうことの「プログラマの常識」の内容はここで培ってもらう。培い方は本記事でも講義でも説明しません。慣れてもらう部分が大きいので適宜この本を読んでもらって培ってもらう。

プログラミングの教え方

プロジェクト作成

npm initさせたいよね

意味教えてると大変だから「とにかくこうやってプロジェクト作ってくれ」とコマンド渡して毎回見てそれで始めると覚えてもらう

-yでいいでしょ。細かく入力させてると大変

Hello World

とにかく起動させたいよね

適当にconsole.logあたりで画面出して軌道の達成感を味わってもある

演出大事。「おめでとうございます。これであなたはプログラマーです」とかいう。達成感大事。達成感は多いほどいいですからね

実装とテスト

四則演算覚えてもらう意味でもplus,minus,multiply,powerを持つクラスを作る課題をやってもらう

適当にplus,minusは一緒にやって学んでもらってmultiplyは自分でチャレンジ、テストでplus,minusあたり一緒にやってmultiplyチャレンジ、べき乗を学んでもらう意味でpowerをテストから先に作って実装してもらうとか

ツールの教え方

Gitとかnpmとかそういうの

目的とか各種設定の意味とかそういったこと教えてるとまずパンクするだろうから通常の使い方だけ教える

作ったプロジェクトをPushさせる

学習度合い見る意味でもやってもらう

Gitはcommitとpushを重視

commitやpushをやっていいこと、やるべきだと覚えてもらう。

沢山commitとpushをやってメッセージの書き方とかテンポとかに慣れてもらう

Cloneはいったん一緒にやるだけ

大変だからね。2,3回目とかで改めて自分でプロジェクト作ってみようフェイズ作ってそこで覚えてもらう

Branchは遅くていい

本格的に開発に参画させるならわからないけど学習という意味で優先度は遅い。別に取り返しつく状況だから

プログラミング知識の調べ方

参考にすべきWebページ

プログラミングに関する情報は、インターネット上に豊富に存在します。信頼できる情報源を活用することで、効率的に知識を得ることができます。以下に、特に参考になるサイトを紹介します。

  1. MDN Web Docs (Mozilla Developer Network)

    • 主にウェブ開発に関する情報が充実しています。JavaScriptやTypeScriptのリファレンス、CSS、HTMLの詳細な解説が揃っています。
    • MDN Web Docs
  2. Stack Overflow

    • プログラミングに関するQ&Aサイトです。具体的な問題に対する解決策が見つかりやすく、多くのプログラマーが利用しています。
    • Stack Overflow
  3. GitHub

  4. 公式ドキュメント

本の買い方

インターネット上の情報も便利ですが、体系的に学ぶためには書籍が有効です。以下のポイントを参考にして、自分に合った書籍を選びましょう。

  1. レビューを確認

    • Amazonや他の書籍販売サイトでのレビューを参考にして、評価の高い本を選びます。特に初心者向けの本は、他の初心者からの評価が高いものを選ぶと良いでしょう。
  2. 著者の経歴を確認

    • 著名な開発者やエキスパートによって書かれた本は、内容が信頼できることが多いです。著者の経歴や専門分野を確認しましょう。
  3. 内容の確認

    • 書店で実際に本を手に取って内容を確認できる場合は、目次や冒頭の数ページを読んで、自分に合ったレベルかどうかを確認します。
  4. 推奨書籍リストを活用

    • 多くのプログラミングコミュニティや教育機関が推奨する書籍リストを参考にするのも良い方法です。

結論

プログラミングの学習には、信頼できるWebページと良質な書籍の両方を活用することが重要です。適切な情報源を見つけることで、効率的に知識を深め、実践に役立てることができます。

こんなかんじかねえ

ダーツスタンスメモ

矢を真っ直ぐ飛ばすための立ち方

前側の足の踵と後ろ側の足を、的に一直線に並べ立つ

横側の調整

完全に横向きにすると足が痛かったのと、猿腕なのか真っ直ぐ降ろした時、肘がブレて腕が左右に引っ張られたのでその調整が目的

肘が若干外に出るような位置になり、腕の回転が安定した

また、体のバランスがなんか取りやすくて立ちやすくなって、無理な体勢と感じることが減り力みづらくなった

足はそれぞれ斜めに置く感じ。無理な体勢と感じないことが重要だと思う

立った時なんか合わないと思ったら一度離れて、ゆっくり回るように歩いて力を抜いて自然に立ち直すとリセットしやすい

高さ調整は、身を乗り出したり引いたり、真っ直ぐ前に出したり

縦側の調整 ようわからんけど、ちょっと背伸びする爪先立ちみたいな感じで胸を張るように身を乗り出して、体をちょっと上げるように立つと矢が上に飛んでいく

逆に体を引いて肩をすくめるように身を引く感じで立つと矢が下に飛ぶ

体を真っ直ぐ前に出したらニュートラルってことにしてこれで高さを合わせるのが良さげ

ダーツ言語化

前提

  • 猿腕を考慮
    • 完全に腕をまっすぐに合わせないなど
  • 腕を曲げきれず、例えば肩をさわれない
    • 完全に曲げ切る必要はない。自分の動きの無理ない範囲
  • 初学者のメモ

軽い流れ

  1. つま先を先に合わせるように足を置く(スタンス)
  2. 構える。気にすることは以下。ただし気にし過ぎない
    1. 親指にダーツの重心を乗せるように置き、それを少し支えるように人差し指を右斜め上側に添える(2本指グリップ)
    2. 肘を立てて手首を投げる位置に合わせる
      1. 猿腕なので完全にまっすぐにしない。肘が少し右に寄らして、腕を真っ直ぐ伸ばせる位置を確保する
  3. 的を見て狙いを定める
  4. 手元を見て構え方とリリースする位置の調整とイメージを作る
  5. ゆっくり、腕を後ろに曲がり切るまで引く(テイクバック)
  6. 力を抜いて、腕を自然に伸ばしてリリースポイントまで少し動かす
  7. 腕の振りに合わせて力を抜いて自然に投げる
    1. 指はそれぞれ広げて離れるイメージ
    2. 投げた後の指は手で銃を作ってる時の形っぽくなる。この形にこだわらない
  8. 投げた後は人差し指が投げた先を指すようにする

スタンス

あまり定まってない。力を抜いて立てること重視

前により過ぎると腕の可動域を取りづらく、いっぱいいっぱいになってしまうので、後ろ足の位置を気にする方が良さげ。後ろ足しっかり地に着けるか軽く浮かせるかは定まってない。とにかく軽く立てて腕の可動域を無理なく取れること

テイクバック

ゆっくりを意識。テイクバックが終わった後少し停止しても良い

速いテイクバックは力が入りがちなので一回止まるくらいがちょうど良いかもしれない。一番意識しやすくて一番投げた後に出やすいので気になったらここから直す

サーミローグ初手

前衛スペクター軸

前スペクター補オーキッド医アンセル

最近の個人的なトレンド。分隊選ばず理性ボーナス要求もなく特別昇進に一喜一憂することもない。医療もいてバランスがいい。しかもみんな持ってるでしょ

1層できちんと全員仕事がある上後半腐りにくいのが良い。コストもなんとかなる範囲

初手というか一層に期待されるものって多ブロ群攻かつ耐えられる地上戦力だけどちゃんと満たす。

前衛ガヴィルが使用率高いけどスペクターも充分強い。というか食い縛りをスキルで出せるし昇進でリジェネ入るし扱いやすさはスペクターの方が上まである

分隊はなんでもいいけど前衛分隊が普通に扱いやすい。氷原は地上の需要が結構あるし先鋒にも適用されるのが偉い。イネス5コスで確実に迎えやすいし、希望と召集ダブついても使う先はいっぱいある。ムリナール特別昇進とか来たら大興奮

特殊分隊でも良い。特殊テキサスやヤトウなんて初手で扱うのめんどいけど、強いから欲しいし特殊も術師も高難度で使いたいオペレーター多いので、序盤はスペクター後半は特殊術師と綺麗に進行できる

少なくとも昇進2前提のソーンズより使用率高くていいと思う

サーミローグ

雪原から出られません

猛威13クリアして分隊使用感調べるため猛威12End1クリア埋め中

システムは統合戦略最高

本当に素晴らしい。#2、3の不満点を解消しつつゲームシステムの幅を増やしている

マス操作(啓示)

進行するマスを変えたりボーナスを得たり。低難易度は救済で、高難易度は前提になる良い要素

エンド分岐に統合されてるのも良いところで、End2、3のために非戦闘マス片っ端から入ってガチャる必要なくなり、目的のエンドに対応したマスをちゃんと踏めば選べる。神。最高。

階層が少し短くなった

各層の最短マス数が若干減ってる?

縦移動要素あるし長くいようとすれば前より長くできるけど、1プレイの時間が短くなって遊びやすくなった。1時間切りまくり

耐久値ペナルティ廃止

先鋒分隊が使いやすく。というか耐久値もすぐ戻せるしほぼノーペナ分隊になった

海の耐久値減った瞬間ペナルティがめっちゃのしかかってくる調整、フレーバーはよかったけどゲーム的にはストレスだったので良い

ペナルティ要素が柔軟に

ペナルティを解消したりできる。解消について緩和しすぎかもとは思うけど、耐久値減っても即座にやる気無くならないので良いかな

マス選択のゲーム性向上

海であった縦移動がコスト緩和で行いやすくなった上、マスの可視範囲が取っている数値によって変わったり啓示をどう使うか、それを見越してどのルートを取るべきかなど遊びの幅が広くなった。ほんと楽しい

難易度バランスは惜しい

古城ライク。序盤むずい系

海は階層進むごとに難しくなって5層は絶望感あるステージばかりで緊張感すごかったけど、雪は1層からそれなりに難しくて運ゲーにもなる

そのうえ基本的に3層がピークでそこを抜ける戦力が出来てればなんとかなる。逆に絶望ばかりだった海5層と違い雪5層は絶望的なステージは今のところそんなない。音楽強襲が結構きつい印象くらい

海の難易度は緊張感あって進むごとにドキドキして良かったから、雪もそんな感じであってほしかった

いきなり合計4ブロと回復、火力全てが欲しくなる1層の獣の群れマジで許さんからな

破壊戦術が強く感じる

今のところ初手フェンクルース特殊テキサスの編成が安定しやすい。獣の群れ以外の1層ステージはまず行けるし2層以降もアドリブが効く

そのためこの編成を安定して使える破壊戦術や支援分隊が使いやすい

星5以下スタートするなら寒クルースやカニパラートとかジェイなど強いオペいるけど、安定性で言えば特殊テキサス隊になる。Rヤトウは昇進2の対応力や操作のめんどさで優先度落としてる。

ビーントークスタートもやってみたけど、フィジカル欲しい今回あまり良くはない。ジェイ君は1ブロ以外めっちゃ強い、なんなんだこいつ。実装当時から弱かった時がない

イネス最強

実質ブロック数が多すぎる

コスト増やせるって意味でもめっちゃ強くて、ティアランク作ったらティアテキサスの下にティアイネスがあるレベル