TDDベースの面接の質問を共有できる人はいますか?


ベストアンサー

私は現在、これを非常にうまくやっているAutoTraderで働いています。

ノートパソコンの前に座って、より大きなモニターとキーボード/マウスを持ち、上級開発者の1人とペアリングし、別の上級開発者が観察します。

とても楽しいです。みんな、いつもの面接の神経を除いて、そしてあなたが新しい人々に会っているという事実。しかし確かに、私があなたのペアであるとき、私は少し友好的な関係を築き、あなたを歓迎していると感じさせるなどを試みます。私がいつもするように。私は実際にあなたが成功することを応援しています。

あなたは簡単なタスクの半ページの問題の説明を受け取ります。次に、ペアプログラミングを少し行います。

観察され、採点されたものがいくつかあります。

  • 最初にテストを作成しますか?コードの後?決して?
  • テストを使用して設計について考えますか?
  • 明確に名前を付けますか?
  • OOP、手続き型プログラミング、または1つだけを好みますか?巨大な機能?
  • ペアとうまくやりとりしていますか?それともまったくですか?
  • 進行中に自分の考えを説明し、ペアに貢献してもらいますか?それとも黙って座っていますか?
  • コレクションのようなJavaの標準機能を使用していますか?そうでない場合は、どうしますか?
  • IDE(選択したもの)をうまく使用していますか?
  • 問題をうまく分割していますか?不完全に?まったくそうではありませんか?

Java、TDD、および/またはユニットテスト用の設計を行うことができ、適度に人懐っこい種類のように思える場合は、高得点になる傾向があります。

このテストは、奇妙な言語機能の知識、奇妙なアルゴリズムの知識、または問題の解決に関するものではありません。

CVに書き込んだこれらのことを、実際にどのように使用するかを確認することがすべてです。

あなたはそれを本当に楽しむでしょう。候補者がどこにいるかを誰もが公平に把握できます。

偽の履歴書の主張も容赦なく洗い流します。

TDDを実行しますか? 「アサート」の意味がわかりませんか?まあ。 OOPをマスターしたとしましょう。動作しないすべてのコードは、提供した単体テストと同じ方法ですか?ああ、親愛なる。

(そして、そうです、それは本当に起こりました。)

私にとって、このプロセスの両側にいるのは目を見張るものでした。

回答

TDDはツールです。何が問題なのかは、 TDDを宗教として扱うことです。

TDDは通常、ユニットテストで行われます。小さなパーツまたは機能(「ユニット」)のテストです。 )あなたのコードの。単体テストは高速で実行されることになっているため、通常は外部サービスの依存関係をモックアップして、コード自体がテストされていることを確認します。

これに関する巨大な部屋の中の象の問題は、モックした外部サービスに関数のロジックのほとんどが含まれている場合があることです。 「ユニット」がクエリを使用してデータベースからアイテムを取得して返す場合、その相互作用は100%役に立たないモック 型チェックの代わりを除いて。

もう一度言います:いわゆる「ソートリーダー」 」TDDの福音を説く人は、動的言語の福音も頻繁に説教します。したがって、彼らが言っている言語ははるかに生産的です実際には、テストにはさらに多くの作業が必要であり、リファクタリングが必要な場合は、多くの場合、これらのテストを書き直す必要があります。

C#、Java、TypeScriptなどのより安全な言語でコードを記述してください。タイプがまだ有効であることを確認することを心配する必要はありません。また、実際には何もテストしないテストを作成する必要がないことに加えて、静的型言語を使用することによる実際のメリットはトンあります。

では、「何もテストしない」テストとはどういう意味ですか?データベースに対してSQLクエリを実行する関数があるとします。特定のフィールドでフィルタリングされたアイテムを探すことになっています。高速な単体テストを作成するには、SQLクエリをモックします。モックライブラリがサンプルデータセットで動作するPostgreSQLのすべてのロジックを実際にシミュレートできない限り、関数の実際のコアロジックはまったくテストされていません。 ;ロジックを検証するために記述できる唯一の実質的なテストでは、モックが適切な応答を返していることを検証するだけです。

モックはよく見かけます。単に「データベースが適切な回数呼び出されたことを確認する」だけです。結局のところ、これで100%のコードカバレッジが得られます。素晴らしい、技術者以外のマネージャーを感動させる数であり、実際にはまったく意味がありません!チームの欺瞞統計に行きましょう!

いいえ、必要なのはシステムテストまたは統合/ E2Eテストで、システム全体がワーキング。単体テストだけでなく、データベースへの呼び出しをモックしないテストを行います。代わりにそれらの呼び出しを実行します。また、テストスイートが実際のテストデータベースを立ち上げ、それをクリアしてテスト間でシードする必要がある場合、TDDを実践として非現実的にします。遅すぎます。

最初にコードを記述してから、E2Eテストを記述して、正しい結果が得られることを確認してください。 Jesthttps://jestjs.io/docs/en/snapshot-testingなどのテストスイートのスナップショット機能を使用して、応答が変更されていないことを検証できます。 一度見て、正しいことを確認します。次に、Jestに正しいことを伝えた後、今後の実行で同じままであることを検証します。 APIは、ほぼ自動化された方法でテストし、テストを更新することができます!

したがって、TDDの忠実な人の怒りを無視すると、必要がないため、作業を2倍速く行うことができます。テストが失敗するのを確認するために、完全なE2Eスイートが実行されるまで10分(またはそれ以上!私は1時間以上かかったテストスイートを見ました…)待つために

span>コードを書き始める前に。

さらに、Moray Taylorの回答で指摘されているように、UI をテストするは次のとおりです。多くの状況で実用的ではありません。 UIに適用できるいくつかのレベルのE2Eテストがありますが、ほとんどの場合、投資収益率が一般的なケースでそれだけの価値があるとは思えません。

そうは言っても、100を超えるさまざまなビデオゲームで使用されていたグラフィックライブラリに取り組んでいて、E2Eテストを作成しました。ライブラリの内部ロジックへの変更が、私が見たこともないようなあいまいなゲームを壊さないことを検証するためのスイートです。ライブラリは常により徹底的なテストに値します。しかし、単一のアプリケーションのUIの場合、E2Eテストは私の経験ではほとんど意味がありません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です