システムテスト自動化エンジニアに必要なテクニカルスキルって何nano

テスト自動化や、そのために必要なプログラミング等を教えるようなお仕事をチームでやっています。

組織としてやっていることの概要は昨年のアドベントカレンダーを参照。
→[会社でテスト自動化の教育を整備・普及させた／ている話 - Qiita](https://qiita.com/YoshikiIto/items/ab4daee2b17dffcbb066)

また、個人としても「テストエンジニアにプログラミングを教える」的なことをちょこっとやってました。
→[テストエンジニアのための初めてのプログラミング](https://yoshikiito.github.io/programming4testers/)


プログラミング等を教える／学んでもらうと一言で言っても、”どこまでやればいいのか”は際限がありません。いくらでも学びようがあります。
とはいえ私が、特に会社のお仕事としてターゲットにしているのは「システムテストの自動化ができるようになること」です。

この、システムテストの自動化ができるくらいの、プログラミングを含めたテクニカルなスキルというのはざっくりどんなレベルなのか、を考えてみました。

※言わずもがなですが、テスト対象やらプロジェクト内容やらによって必須スキルは変わってくるので、目安程度で捉えてください。
※ローコード／ノーコードなテスト自動化ツールを用いる場合は以下がすべて必要とは言いませんが、個人的には知っておいてほしいので書きます

## システムテスト自動化に必要なスキルと、教えるときに気をつけていること

これは必要だろう、というものと、（それだけだと面白くないので）教えるという点でどんなことをしているか・気をつけているかなども併せて触れておきます。

### プログラミングの初歩

いわゆる「プログラミング的思考」と、言語によらない（命令形言語の）共通概念の理解は必要です。
最終的にシステムテストの自動化を目指しているので、このプログラミング的思考にあたる部分、つまり「コンピュータに命令したいことを一定細かい粒度の手順に分解する」というところについては比較的すんなり入ってくるのでは、というのが私の持論です。

こちらも過去Qiitaに書きました。＞[プログラミングの入り口として自動テストは有効だ - Qiita](https://qiita.com/YoshikiIto/items/94f6edcb8a029636b80f)

プログラミング的思考と概念理解については、書籍を渡して「がんばれ」と言うだけではまず身につかないので、仕事ではオンラインで解説を読みコードが書けるサイトを用いて学習してもらっていました。（当初はProgate、のちにPaizaラーニングforTEAM）
サイトで学習することで、変数や関数の書き方、リストなどのデータ構造、if, forなどの制御構文など「プログラミングっぽいことがら」が、説明されればできる状態になります。理解が怪しい、不安だ、と本人がなった場合には、別途おすすめの本やWebなどを伝えて理解の助けにしてもらいます。※同時に、参考にしてはいけないサイトなども伝えます。

また、サイトでの学習を通じてコマンドプロンプト、PowerShell、WindowsTerminal、Bashなどの基本コマンドについても学んでもらいます。直接プログラミングではないものの必須です。

### 2歩目として絶対必要なもの

ただの遊びでプログラミングしているのであれば上に書いた初歩で「楽しい！」でいいのですが、仕事でやるとなるとたとえそれがテスト自動化だったとしても全く足りません。

他にシステムテスト自動化を業務で行う上では以下が必要です。

- モジュールやライブラリを探してきて使う
    - 本に書いてある「ほげほげを使います」をなぞるだけでなく、自分でググって見つけたものを使う
- ファイルの入出力処理の理解
    - データ駆動テストをやろうと思ったら、csvなり.xlsxなりを読み書きするので
- バージョン管理の基礎
    - Gitの基本と、GitHubなどリモートリポジトリとのやりとり
- 単体テストフレームワークの理解
    - 画面の自動操作ツールと併せて使う機会も多いため
- フォーマッタ、リンタなどの導入

このへんを教えるにあたって、会社ではたとえば「Python＋Seleniumを使ってHOTEL PLANISPHEREのテストを書く演習」を通じて学んでもらっています。

参考＞[HOTEL PLANISPHERE - テスト自動化練習サイトのコピー](https://yoshikiito.github.io/hotel-example-site/)

テスト自動化エンジニアであれば全員触ったことがあるだろう上記サイトでは、日程を指定してホテルを予約する、といった操作が可能です。

たとえば「テスト実行日から一週間後の予約をする操作を自動化しなさい」という問題を出すと、解く過程で「日付の処理」という壁にあたります。工夫なしでやると、8月32日や13月4日のような日付を指定して詰まります。
そこで自力で検索をして、「なるほどdatetimeモジュールを使えばいいのか」など、何らかのやりかたにたどり着いて実践する、という経験を積んでもらうのが有効と考えています。

また、フォーマッタやリンタなどの導入については、いきなり「常識です」とお伝えすることもできますがそれはせず。まずは一旦書いてもらったものを講師によるレビューでいくつか指摘をして、「で、人間からたくさんツッコミ入ると嫌ですし時間もかかりますよね。ところでこのチェックも自動でできてですね」という形で導入します。

このときも、懇切丁寧に教えるというよりも、以下記事をぽいっと渡して「参考にしてみてね」という言い方をします。
＞[Pythonで書いたE2E自動テストのコードも静的にチェック＆フォーマットしましょう【VSCode】 - Qiita](https://qiita.com/YoshikiIto/items/91210a36579a16261084)

プログラミングのお仕事の現場でも、どこかに書いてあることを一つ一つ説明してもらうことはなく、「コレ見てわからなかったら聞いて」が普通だと思うので。

### 絶対とは言わないまでもできてほしいもの

QAチームの一員としてソロでテスト自動化始めました、的な場合は上の2歩目まででスタートしてもいいと個人的には思うのですが、なる早でさらにキャッチアップすべきものもあります。

真っ先にあがるのは、CIツールからの自動実行です。パイプラインに組み込む、まで出来ると嬉しいものの最低限CIツールからの定期実行くらいはやりたいところ。

また、最近ではDocker周りも必要になることが多いため、完璧な理解といかなくとも資料見ながらコマンド打って使えるくらいは必要かと思います。

## まとめ

システムテストの自動化を行うエンジニアに必要なスキルについて考えてみました。考えてみましたといいつつ、その実態としては「会社ではこんなこと教えてますよ」の紹介的な側面もありました。

昔は「テストエンジニアはコードが書けない」的な時代もあったようですが、最近はそんなことはなく、むしろ教えてる側からすると「適切な機会と時間を設ければ大体できますよ」というのが実感です。


他の皆さんの感覚（ウチではコレだけじゃ全然足りないぜ、とか）も伺ってみたいところです。