Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

その最初の複雑なテストを書く

テストされていないコードはどれですか?制御できない複雑な状況を処理するコードですか?スレッド、実行中のコマンド、git、ネットワーキング、またはUI?

私たちのアプリは、複雑なときに最も興味深いものです。彼らはまた最も危険です。 そのため、テストが難しいコードは、まさに適切にテストする必要のある種類のコードです。 それは常に起こるわけではありません。

代わりに、そのコードに触れるたびに、軽く触れます。あなたは慎重に踏みます。多分あなたはいくつかの手動テストをします。また、プルリクエストを送信するときは、チームメートがそれらのテストが存在しないことに気付かないことを望んでいます。

しかし、それでは状況は改善されません。 次回は同じ問題、同じバグ、同じストレスに遭遇します。それ以降は毎回発生します。どうすれば、これらのやりがいのあるテストを信頼できるものにすることができますか?

考え方を変える

これらのテストで最も苛立たしいことは? 書くのに必要な時間の10倍の時間がかかります。 テストの作成に費やす時間に対してテストで節約できる時間を見積もると、それだけの価値はないように思われます。

しかし、それはこのテストだけではありません。 今後のすべてのテストについてです 。

私が見た中で最もテストされたコードのほとんどは、多くのサポートがあります。 test/modelsのコードだけではありません 。非常によくテストされたコードには偽物があり、モックがあり、テストフィクスチャの優れたセットがあり、テスト専用の構成オプションがあります。

書き、まとめるのに時間がかかります。

しかし、一度手に入れると、とても気持ちがいいです。 テストの後にテストを思い付くことができ、コードに満足し、投資した後すぐに移動できることに自信があります。

本当に すでに行った作業について。

つまり、複雑なコードのバグを防ぐだけではありません。 これは、将来のコードを1つずつ簡単にテストできるようにすることでもあります。

統合テストにします(今のところ)

ただし、価値を理解することではない場合もあります。私はそれを理解しています。 代わりに、小さくて高速な単体テストの書き方がわからないため、行き詰まってしまいます。

gitを実際に実行せずに、デプロイメントツールで適切なgitコマンドを実行していることをどのようにして知ることができますか ?リモートサーバーに正しいヘッダーを送信していることをどのように確認しますか?

十分な時間があれば、テストが信頼できる高品質の偽物を作成できます。

しかし、それについて考えるのが多すぎると思われる場合は、他に試すことができます。 テストを2つの別々のステップに分けます:「コードをテストする」と「モックを書く」。

そのサーバーを呼び出すだけです。そのコマンドを実行するだけです。なぜですか?

  • 開始する方がはるかに簡単です。 おそらくこれらのコマンドを手動でテストしていますよね?コンソールで実行しますか、それともブラウザで試しますか?テストにコピーするだけです。
  • 最終的にモックや偽物を作成する場合は、これらのテストを使用して、モックが機能することを確認できます。 偽物から見たのと同じ振る舞いが現実の世界で見られる場合、偽物はおそらく良いでしょう!

ただし、これらのテストを永久に維持したくない場合があります。

  • 統合テストで発生するすべての問題があります。 彼らは遅くなる可能性があります。ライブインターネット接続が必要な場合があります。アプリが実際には気にしない動作に依存しているため、脆弱である可能性があります。
  • 現実の世界ではテストできない場合があります。 たとえば、相手側のサーバーを制御していない場合、どのようにして特定のエラーコードを強制しますか?
  • 依存しているサーバーによってブロックされる可能性があり、それによってテスト(およびアプリ)が破損する可能性があります。 これは実際に私に起こりました、そしてそれは大きな問題でした。

したがって、テストを実際の統合テストとして作成することは、永続的な解決策ではなく、長期的な解決策でもありません。しかし、これらすべての欠点があっても、それでも役に立ちます。また、交換後も、別のスイートで統合テストを継続できます。そうすれば、仮定だけでなく、いつでも私のコードを現実と照らし合わせてチェックできます。

一部のコードはテストが難しいだけです。信頼できるテストをすばやく作成するために必要なインフラストラクチャを構築するには、しばらく時間がかかります。そして、多くの場合、それは価値がないようです。

しかし、その単一のテストについて考えるのをやめ、将来のすべてのテストを簡単にすることの価値について考えると、複雑なコードのテストははるかにやる気になります。 そして、最初のテストが終了すると、残りのテストは魔法のように非常に書きやすくなるようです。

ただし、それだけでは不十分な場合もあります。コードが現実の世界で機能することを確認する方法を知っていても、それをテストする方法がわからない場合はどうなりますか?

それが起こったら、あなたが純粋で孤立した状態を保つ必要があるものとしてテストを見るのをやめてください。 代わりに、すでに手動で行っていることを自動的に行う方法と見なしてください。

完璧ではないので、できるだけ早く交換する必要があります。しかし、これらのテストにより、複雑なコードをすばやく記述および変更するために必要な自信を得ることができます。


  1. C#コードのユニットテスト

    単体テストは、開発プロセスでコードを維持するのに役立つため、C#コードの鍵となります。開発サイクルの問題について知ることができます。 単体テストを使用すると、コードの信頼性と再利用性を高めることができます。 単体テストを採用する基本原則の1つは、最初にテストケースを記述し、次にテストに合格する簡単なコードを記述しなければならないTDD(テスト駆動開発)アプローチに従うことです。 単体テストでは、Microsoftの単体テストツールを使用する必要があります。これをMS単体テストと呼びます。 単体テストを作成するには、ソリューションエクスプローラーに移動し、右クリックして[新規]に移動し、

  2. Test-Commit-Revert:Rubyでレガシーコードをテストするための便利なワークフロー

    それは私たち全員に起こります。ソフトウェアプロジェクトが成長するにつれて、コードベースの一部は、包括的なテストスイートなしで本番環境に移行します。数か月後に同じコード領域をもう一度見ると、理解するのが難しい場合があります。さらに悪いことに、バグがある可能性があり、どこから修正を開始すればよいかわかりません。 テストなしでコードを変更することは大きな課題です。プロセスで何かを壊すかどうかはわかりません。すべてを手動でチェックすることは、せいぜい間違いを犯しがちです。通常、それは不可能です。 この種のコードの処理は、開発者として実行する最も一般的なタスクの1つであり、以前の記事で説明した特性テ