ユニットテストをどのように楽しくしましたか?[閉まっている]


18

ユニットテストをずっと愛してきたなら、あなたにとって良いことです!しかし、それが好きで生まれていない不幸な人たちのために、どうやってこの仕事をもっと楽しくすることができましたか?

これは「単体テストの正しい方法」の質問ではありません。私は、単体テストを書くことの退屈さ(あえて言う)を減らす、ちょっとした個人的なトリックを知りたいだけです。


1
私は単体テストや他のテストを書くのが好きです。なぜなら、他のほとんどすべての人がそれを吸うからです(時には、私がテストしているツールを作るのも吸うのです)。いいえ、開発者として嫌いではありません。使いやすさ、見た目、自動化が好きです。MbUnitライブラリには、私の人生を変えました。自動テストは重要です。自動テストにより時間を節約できます。自動テストはお金を節約します。自動テストは命を救うことができます。自動テストが唯一の方法です。自動テストはさらに別の安全策です。私が巨大な建築に取り組んでいる50人のうちの1人であるとき、私は壁にさらに別のレンガのように感じます。単体テストでは、私が管理しています。
仕事

単体テストでの怠azineと欲求不満は、脳が役に立たないと感じる仕事に対する正常な反応です。ROIがほとんどない、または負のユニットテストを作成して維持するのは嫌です。ただし、有用なテストを作成するのは楽しい作業ですが、何が有用で何がゴミかを認識するのは、それ自体のスキルです。あなたがここに読ん主演することができ、彼のブログに基づいて、このトピックに関する本を書いています男は、あります:enterprisecraftsmanship.com/2016/06/01/...
コラ

回答:


22

まず、私はあなたに同意します-すでに完成したコードでユニットテストを書いている場合、またはコードを手動でユニットテストしている場合、私も非常に退屈だと感じます。

ユニットテストには、本当に楽しいものになる2つの方法があります。

  1. テスト駆動開発(TDD)を使用することにより、最初にテストを作成することで、コードで必要な次の機能や動作について考えることができます。私は自分の最終目標に向かって小さなステップで運転し、数分ごとにその目標に向かって具体的な進歩を見ることができ、非常にやりがいのある楽しいものだと感じています。
  2. デバッガーに直接向かうのではなく、バグがある場合、バグを再現する失敗した単体テストを作成する方法を見つけるのは楽しい挑戦です。コードが失敗する状況を最終的に把握し、それを修正し、新しい失敗テストでバーが緑色に変わる(そして既存のすべてのテストで緑色のままになる)のを見るのは非常に満足です。

12

独り善がり。

私は半分冗談です。「私を見て、良いプログラミング習慣を身につけてください。この「ユニットテスト」は、10年前から私がやったことのないことです。なんて馬鹿なことでしょう。そして、その結果としてキャッチするすべてのバグを考えてください。私が今やっているこの退屈で退屈な仕事-私のコードは素晴らしいでしょう!私は確実に昇給するでしょう!* "

*-いいえ、できません。

エクササイズや健康的な食事のようなものです。具体的なメリットが実際に発揮されるまで(「神聖なボール、私は実際に生産に潜む回帰エラーのがらくたをキャッチしています!」)、あなたが正しいことをしていることを知っていることの道徳的誇りはあなたを助けることができます使って。


7

1つは、ユニットテストを書くことはほとんどありません。単体テストは目的を達成するための手段であり、それ自体が目的ではありません。それらは、「このコードは想定されている基本的なタスクを実行しますか」と答える方法です。

たとえば、一部の人々は関数を記述し、次に対話型セッションを開いていくつかの値でテストし、機能することを確認します。

def fact x
  if x == 0
    1
  else 
    x * fact(x-1)
  end
end

>> fact 10
=> 3628800
>> fact 7
=> 5040

しかし今、バグを発見しました:

>> fact -1
SystemStackError: stack level too deep
    from (irb):2:in `fact'
    from (irb):5:in `fact'
    from (irb):10

あなたはそれを修正します:

def fact x
  if x < 0
    raise "Can't take the factorial of a negative number"
  elsif x == 0
    1
  else 
    x * fact(x-1)
  end
end

>> fact -1
RuntimeError: Can't take the factorial of a negative number
    from (irb):3:in `fact'
    from (irb):10

しかし今、あなたは本当にそれがまだ動作することを確認するためにテストすべきです:

>> fact 10
=> 3628800
>> fact 7
=> 5040

ご覧のとおり、同じテストを繰り返し続けます...結果を視覚的に比較する必要があります。この場合、ユニットテストは繰り返しを回避する方法です。必要な作業量が減ります。これは馬鹿げた小さな例ですが、現実の世界では、手動でテストすることがますます重要になり、ますます困難になっています。もちろん、これが意味することは、人々は単に個々のコンポーネントをテストしないということです。プログラム全体をテストするだけです。しかし、その後、バグが発生し、見つけるのがはるかに難しくなります。または、バグが発生し、それらは修正されますが、同じバグが再び発生するのは、それが発生しないことを確認するために誰もテストケースを追加しなかったためです。または誰かが大きなコードを見て、「これが文書化されておらずテストもされていないので、これが何をするのかわからない...」と言います。このバグを修正しても、それに応じて他の何かを壊すかどうかはわかりません。多分私はこれを一から書き直します。」

単体テストは、これらの場合の余分な作業をすべて削減します。それらを楽しくするための最良の方法は、置き換えられる作業のすべてを人々に理解させ、各コードが何をすべきかを知ることからもたらされる追加の柔軟性を確実にすることです。ある程度、人々はユニットテストがどれほど重要かを理解するために、大きなコードベースの作成と保守についてもう少し経験を積む必要があります。すべてのコードが一度書いて捨てたものである場合、彼らはそれを決して得ません。

そして、ユニットテストは事後に書かれてはいけません。あなたが「知っている」コードが既に動作している場合、余分な雑用として。ユニットテストは、問題のコードを記述した直後に、または少なくとも(最初に記述するのを忘れることがあるため)少なくとも最初に記述する必要があります。これはテスト駆動開発と呼ばれ、APIの改善に役立ちます。最初にAPIを実行するテストを作成すると、コードを作成する前にAPIを使用するのが面倒であることがわかり、テストを後で追加する場合よりもはるかに簡単に再設計できます。


@Biran、私は同意します。しかし、それはすべて「正しい」ことです。しかし、どのようにそれを楽しいものにしますか?少しでも?
プリーツ

@Preets反復的な手動テストの実行を避けているので楽しいです。事実の後にではなく、最初に行う方がより楽しいです。なぜなら、それは既に「機能する」コードの事後処理ではなく、設計プロセスの一部になるからです。
ブライアンキャンベル

だから、それをやるのにひどく時間を費やして、それを右にやるのは比較して楽しいと感じる?...それかもしれない作業、実際に....
BlairHippo

@Biran、私は同意する、「最初に」それをしなければならない-退屈をなくすだけでなく、ユニットテストの真の利益を得るためにそれを行う正しい方法だと思う。
Preets

@ビラン、ありがとう!私は最近、私の趣味のプロジェクトでTDDを使用しました。これにより、単体テストについての考え方が変わりました。
プリーツ

5

知りません。ユニットテストを私にとってより楽しいものにしているのは、ソフトウェアに変更を加えるたびに経験することのないイライラする、長くて退屈でやりがいのないデバッグのすべての考えです:)


2
それは興味深い。個人的に、誰かが私のコードにバグを見つけたとき、私は恥ずかしい思いをしますが、同時に、私にとってのデバッグのプロセスは実際には非常に面白く、ユニットテストよりもずっと楽しいからです。それはあなたがその卑劣なバグをキャッチしなければならないパズルを解くようなものです。
プリーツ

@Preets:同意することもありますが、それは楽しいこともありますが、私にとっては、設計は実装よりもはるかに興味深いものです。したがって、実装に多くの時間を費やすのは好きではありません。特に信頼性の高いタイムスケジュールを作成できるので、私はそれが率直で予測可能であることを好みます。ソフトウェアを作成するプロセスを楽しんでいる限り、結果は決定的なものだと思います。
back2dos

ああ、私は完全に同意します!ランダムなバグのあるシステムは、眠れない夜を引き起こす可能性があります。
プリート

3

堅牢で堅牢で安定したコードをチェックインするときに感じる独善的な優位性。また、コードカバレッジツールを使用して単体テストを作成すると、コードカバレッジが90%以上であることをコメントで自慢できます。


3

明らかに、テストファースト開発の満足度と、デザインとテストが一緒になったときの感覚があります。ただし、既存のコードまたはレガシーコードのテストを書くことは、気が遠くなるほどイライラする可能性があります。プロジェクトがメンテナンスパターンにあったとき、カバレッジレポートをゲームとして使用して、テストされていないコードのテストを作成しました。あなた自身や他の人との競争を少し作って、カバレッジ数を増やすことができます。確かに、あなたはそれを取りすぎていくつかの悪いテストを作成するかもしれませんが、それは良い動機付けになる可能性があります。


レガシーコードは一般に簡単にテストできないため、良いユニットテストを書くのに苦労しています-プロセスが苦痛であるだけでなく、結果(ユニットテスト)も特に有用ではありません:-/しかし、カバレッジゲームは良いものです:)
11:22にプリート

1

Flowに入るようにしてください。自分には厳しいが達成可能な目標を設定します。単体テストの目標は何ですか?たとえば、品質を維持しながら、より高速に書き込もうとします。単体テストではあまり考えなくてもいいので、間違えることはまずありません。目標に集中し、目標に近づいているかどうかを頻繁に確認してください。


なぜ、ユニットテストはあまり考えすぎないと言っているのですか?TDDを使用する場合、多くの思考が必要です。それは真実ではありませんか?
プリート

あなたは正しいです、私はTDDを考慮しませんでした。
タマスゼレイ

0

時々、自分のやる気を引き出すために、一日の始めに現在の「コードカバレッジ」を書き留めます。その後、テストを作成して合格するたびに、スイートを実行し、カバレッジ番号を更新します。楽しくて、なぜこれをしているのかを思い出させてくれます。(他の理由もありますが、私は数字が好きです。たぶんそれは私だけです!)


0

ユニットテストはどんな持続可能期間でも楽しめると考えるように心を欺くことができると自分自身を惑わそうとしないことによって。

単体テストを楽しむことはできないという現実を受け入れることは、私にとって非常に役立ちます。

ユニットテストをそれが本当に何であるか、つまり残酷で耐え難く、魂を砕くほど退屈な仕事であると知覚するポイントに到達したときのこれらの短い精神的な遠足で、私はそれらを手放す余裕があるか、つまり機能の正確性に関する高い保証。

常に、答えは圧倒的な「ノー」です。

運命を受け入れると、私はこれらの正方形のオブジェクトを文字、数字、記号を目の前に押し続けます。これをキーボードと呼びます。キーボードのクリックごとに、ユニットテストの終わりがそれよりも近いことを最初の手の経験から知っています行ったことがある。


すべてのテストが良好または有用というわけではありません。これは、TDD'ersや他のテストエバンジェリストが通常言及していないことです。複雑なロジックをテストし、テストがエレガントで実装に結びついていないことを知っている場合、ユニットテストを楽しむまれな瞬間に賭けます。プロジェクトのガイドライン。
KolA

@KolAあなたは創造性を必要とする挑戦的な単体テストがあることは正しいですが、無限の単体テストを書くことは、本質的に興味深いものからも喜びを吸い取ることができます。
バグフット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.