タグ付けされた質問 「testing」

そのシステムの予想される動作に対するソフトウェアシステムの動作の確認。

7
単純な(自己完結型)関数のテストを保持する必要はありますか?
このことを考慮: public function polynominal($a, $b, $c, $d) { return $a * pow($x, 3) + $b * pow($x, 2) + $c * $x + $d; } 上記の機能に対してさまざまなテストを作成し、自分や他の人に「機能する」ことを証明するとします。 その後、これらのテストを削除して、いつまでも幸せに生きてみませんか?私のポイントは、いくつかの機能が機能することが証明された後、継続的にテストする必要がないことです。私は、これらの機能をまだテストする必要があると述べているカウンターポイントを探しています:...または、はい、これらはテストする必要はありません...

9
プログラマーはテスターが悪いですか?
これはすでに質問されている他の質問とよく似ていますが、実際は少し異なります。一般に、プログラマーはアプリケーションのテストの役割を実行するのが得意ではないと考えられているようです。例えば: Joel on Software- テスターがいない上位5つの(間違った)理由(強調) 大学のCS卒業生に、彼らがあなたのために働くことができると告げようとすることさえ考えないでください。私はこれを見てきました。プログラマーは優れたテスターを作りません。そして、交換するのがはるかに難しい優れたプログラマーを失います。 そして、この質問では、最も人気のある答えの1つが言います(再び、私の強調): 開発者はテスターに​​なることができますが、テスターであってはなりません。開発者は、アプリケーションを破壊する可能性のある方法での使用を意図せず/意識せずに避ける傾向があります。それは、彼らがそれを書いて、大抵それが使われるべき方法でそれをテストするからです。 質問は、プログラマーがテストに苦手なのか?この結論を裏付ける証拠や議論はありますか?プログラマは自分のコードをテストするのが苦手なだけですか?プログラマーが実際にテストに長けていることを示唆する証拠はありますか? 「テスト」とはどういう意味ですか?私は、単体テストや、ソフトウェアを作成するためにソフトウェアチームが使用する方法論の一部と見なされるものを意味しません。コードが構築され、ソフトウェアチームが「テスト環境」と呼ぶものにデプロイされた後に使用される何らかの品質保証方法を意味します。
36 testing  qa 

3
統合テストはすべての単体テストを繰り返すことを意図していますか?
関数があるとしましょう(Rubyで書かれていますが、誰でも理解できるはずです): def am_I_old_enough?(name = 'filip') person = Person::API.new(name) if person.male? return person.age > 21 else return person.age > 18 end end 単体テストでは、すべてのシナリオをカバーする4つのテストを作成します。それぞれはPerson::API、スタブ化されたメソッドmale?とでモックされたオブジェクトを使用しますage。 次に、統合テストを作成します。Person :: APIはもうm笑されるべきではないと思います。したがって、Person :: APIオブジェクトをモックせずに、まったく同じ4つのテストケースを作成します。あれは正しいですか? はいの場合、単体テストを書く意味は何ですか、自信を与える統合テストを書くことができたら(スタブやモックではなく、実際のオブジェクトで作業している場合)?

10
開発者は、単体テスト以外のテストを担当する必要がありますか?
現在、かなり大きなプロジェクトに取り組んでおり、JUnitとEasyMockを使用して、かなり広範囲のユニットテスト機能を使用しています。私は今、私が心配すべき他のタイプのテストに興味を持っています。開発者として、機能テストや回帰テストなどについて心配するのは私の責任ですか?これらをMaven / Ant / Gradleなどのツールで使用可能な方法で統合する良い方法はありますか?これらはテスターまたはBAに適していますか?私が見逃している他の有用なタイプのテストはありますか?
35 testing 

6
複雑な正規表現の単体テストが必要ですか?
アプリケーションで複雑な正規表現の単体テストを作成する必要がありますか? 一方では、入力と出力の形式は単純で明確に定義されていることが多いため、テストが容易であり、非常に複雑になることが多いため、テストは特に価値があります。 一方、それら自体は、あるユニットのインターフェースの一部ではありません。インターフェイスのみをテストし、暗黙的に正規表現をテストする方法でテストする方が良い場合があります。 編集: 私は、これが内部コンポーネントの単体テストの特殊なケースであるとコメントしているDoc Brownに同意します。 しかし、内部コンポーネントの正規表現にはいくつかの特別な特性があります。 単一行の正規表現は、実際には独立したモジュールではなく、非常に複雑になる可能性があります。 正規表現は、副作用なしで入力を出力にマップするため、個別にテストするのは非常に簡単です。

6
オブジェクトのモックが難しいシステムをテストするにはどうすればよいですか?
私は次のシステムで作業しています: Network Data Feed -> Third Party Nio Library -> My Objects via adapter pattern 最近、使用しているライブラリのバージョンを更新したときに問題が発生しました。これにより、とりわけ、タイムスタンプ(サードパーティライブラリがとして返すlong)がエポック後のミリ秒からエポック後のナノ秒に変更されました。 問題: サードパーティのライブラリのオブジェクトを模擬するテストを作成する場合、サードパーティのライブラリのオブジェクトについて間違えた場合、テストは間違っています。たとえば、タイムスタンプの精度が変更され、モックが間違ったデータを返したため、ユニットテストを変更する必要があることに気づきませんでした。これはライブラリのバグではありません。ドキュメントの何かを見逃したために発生しました。 問題は、実際のデータフィードがないと実際のデータ構造を生成できないため、これらのデータ構造に含まれるデータについて確信を持てないことです。これらのオブジェクトは大きくて複雑で、多くの異なるデータが含まれています。サードパーティライブラリのドキュメントは貧弱です。 質問: この動作をテストするためにテストを設定するにはどうすればよいですか?テスト自体は簡単に間違っている可能性があるため、この問題を単体テストで解決できるかどうかはわかりません。さらに、統合システムは大きく複雑であり、見落としがちです。たとえば、上記の状況では、タイムスタンプの処理をいくつかの場所で正しく調整していましたが、そのうちの1つが見つかりませんでした。システムはほとんど統合テストで正しいことを行っているように見えましたが、本番環境(より多くのデータがある)に展開すると、問題が明らかになりました。 現在、統合テストのプロセスがありません。テストは基本的に、ユニットテストを適切な状態に保ち、問題が発生したときにさらにテストを追加し、テストサーバーに展開して問題が正しかったことを確認してから、運用環境に展開します。モックが間違って作成されたため、このタイムスタンプの問題は単体テストに合格し、すぐに明らかな問題を引き起こさなかったため統合テストに合格しました。QA部門がありません。

9
QAスタッフは、表示できないキャッシュロジックをどのようにテストできますか?
Webアプリケーションにキャッシングレイヤーを実装しましたが、キャッシングはユーザーに対して透過的であるため、QAがどのようにテストするのか疑問に思っています。 私が持っているアイデアの1つは、キャッシュに入力するコードを呼び出すメソッドにログを記録し、オブジェクトがキャッシュからプルされたときと、データベースからの再作成が必要なときを記録し、テスターがログを表示して、たとえば、特定のオブジェクトは、すべてのページビューではなく、10分ごとにデータベースからリロードされます。 しかし、この状況に対してより良い実践を提案できる人はいますか?
33 testing  caching 

9
ユニットテストを書く前にコードを書くことの欠点は何ですか?
最初に単体テストを作成してからコードの作成を開始することをお勧めします。しかし、私にとっては、逆の方がはるかに快適だと感じています-実際にコードを書いた後、より明確になったと感じているので、コードを書いてからユニットテストを書いてください。コードを作成してからテストを作成すると、テスト可能なデザインの作成に専念しても、コードを少し変更してテスト可能にする必要がある場合があります。一方、テストを作成してからコードを作成すると、コードが形成されるときにテストが頻繁に変更されます。 テストの作成を開始してからコーディングに進むための多くの推奨事項がありますが、逆にコードを作成してから単体テストを行う場合のデメリットは何ですか?

21
ソフトウェアテストは本当に必要ですか?
私はBE(CS)に取り組んでいる学生で、私の質問は次のとおりです。 ソフトウェア分野でのテストが必要ですか? 細心の注意を払ってソフトウェアを作成する場合、なぜテストする必要がありますか? テストした後、私たちはすることができわから我々が行っているので、我々は(意図したとおりの製品/ソフトウェアが動作します)、この目標を達成していることをテストし、それのために?出来ますか? 私の質問:ソフトウェアのテストは必要ですか?

4
Javaでデバッグ出力を処理する正しい方法は何ですか?
私の現在のJavaプロジェクトがますます大きくなるにつれて、コードのいくつかのポイントにデバッグ出力を挿入する必要性が同様に高まっていると感じています。 テストセッションの開始または終了に応じて、この機能を適切に有効または無効にするには、通常private static final boolean DEBUG = false、テストで検査するクラスの先頭にa を付け、この方法で(たとえば)簡単に使用します。 public MyClass { private static final boolean DEBUG = false; ... some code ... public void myMethod(String s) { if (DEBUG) { System.out.println(s); } } } など。 もちろん、それはうまくいきますが、数個を見つめていなければ、DEBUGをtrueに設定するクラスが多すぎる可能性があります。 逆に、出力されるテキストの量が圧倒的になる可能性があるため、私は(他の多くの人と同じように)アプリケーション全体をデバッグモードにすることを好みません。 だから、そのような状況をアーキテクチャ的に処理する正しい方法がありますか、最も正しい方法はDEBUGクラスメンバーを使用することですか?

4
バグを再現するためのハードウェアのセットアップが入手困難または不可能な場合に、新しいコードを効率的にトラブルシューティングまたはテストする方法は?
私は中規模の会社(従業員150人、エンジニアリングチーム10人まで)で働いており、私のプロジェクトのほとんどは、半自動化されたテストアプリケーションを目的として、実験装置(オシロスコープ、光スペクトラムアナライザーなど)とのインターフェイスを含んでいます。ハードウェアのセットアップが利用できなくなった、または利用できなかったために、新しいコードを効率的にトラブルシューティングまたはテストできないいくつかの異なるシナリオに遭遇しました。 例1:ベンチトップタイプのセンサーを使用して10〜20の「バーンイン」プロセスを個別に実行するセットアップ-テスト用にこのようなセンサーを1つ取得でき、ときどきインターフェイスのすべての面をシミュレートするために1つを盗むことができました複数のデバイス(検索、接続、ストリーミングなど)。 最終的にはバグが発生し(最終的にはデバイスファームウェアとドライバーに存在する)、1つのユニットだけで正確に再現するのは非常に困難でしたが、これらのデバイスを10〜20個同時に使用すると「ショーストッパー」レベルに近づきました。これはまだ解決されておらず、継続中です。 例2:コアコンポーネントとして高価な光スペクトルアナライザーを必要とするテスト。このデバイスはかなり古いものであり、大企業に買収されて基本的に解体されたメーカーによると、その唯一のドキュメントは翻訳が不十分であると思われる長巻の(そして情報価値のない)ドキュメントでした。最初の開発中、私はデバイスを自分の机に置いておくことができましたが、物理的にもスケジュールどおりにも、24時間年中無休の複数週間のテスト中に縛られました。 デバイスに関連する、または関連しないバグが表示される場合、アプリケーションの外部でコードをテストして適合させるか、コードを盲目的に書いて実行と実行の間にあるテスト時間で絞り込もうとする問題をしばしば経験する必要があります。プログラムロジックでは、OSAと残りのテストハードウェアが適切に配置されている必要があります。 私の質問は、これにどのようにアプローチする必要があるのでしょうか?デバイスシミュレーターの開発に時間を費やす可能性がありますが、それを開発の見積もりに組み込むと、ほとんどの人が期待する以上に膨れ上がります。すべての問題を正確に再現できるとは限りません。また、ここで同じ機器を2回使用することはほとんどありません。ユニットテストなどで上達することができます...私はまた、問題について大声で話し、一時的な遅延が必要であることを他の人に理解させることができます。これは、研究開発の頭痛だけでなく、通常は冗談として認識されます製造業に売り込まれたとき。

7
継承されたメソッドをテストする必要がありますか?
基本クラスEmployeeから派生したクラスManagerがあり、そのEmployeeにはManagerによって継承されるメソッドgetEmail()があるとします。マネージャーのgetEmail()メソッドの動作が実際に従業員のものと同じであることをテストする必要がありますか? これらのテストが作成された時点で動作は同じになりますが、もちろん将来のある時点で誰かがこのメソッドをオーバーライドし、その動作を変更して、アプリケーションを中断するかもしれません。しかし、本質的に干渉コードがないことをテストするのは少し奇妙に思えます。 (Manager :: getEmail()メソッドをテストしても、Manager :: getEmail()が作成/オーバーライドされるまで、コードカバレッジ(または他のコード品質メトリック(?))は改善されません。) (答えが「はい」の場合、基本クラスと派生クラス間で共有されるテストの管理方法に関する情報が役立ちます。) 質問の同等の定式化: 派生クラスが基本クラスからメソッドを継承する場合、継承されたメソッドが次のことを期待しているかどうかをどのように表現(テスト)しますか? 現在のベースとまったく同じように動作します(ベースの動作が変更されても、派生メソッドの動作は変更されません)。 常にベースとまったく同じように動作します(ベースクラスの動作が変わると、派生クラスの動作も変わります)。または ただし、必要に応じて動作します(呼び出さないため、このメソッドの動作は気にしません)。

6
単体テストの価値を説明する方法
私は同僚に単体テスト(およびテスト全般)の概念を紹介したいと思います。現在、テストはまったく行われておらず、実際にUIを介してタスクを実行して目的の結果を確認することにより、テストが行​​われています。ご想像のとおり、コードは正確な実装と非常に緊密に結合されています。クラス内にあり、システム全体で再利用されるコードがメソッド間でコピーおよび貼り付けされることさえあります。 要件が変更されたため、以前に書いたモジュールを修正するように依頼されましたが、それはかなり疎結合です(希望するほど多くはありませんが、他の多くの概念を導入することなく取得できます)。修正されたコードに単体テストのスイートを含めて、期待どおりに機能することを「証明」し、テストの仕組みを実証することにしました。コードの一部はすでに記述されているため、真のTDDをフォローしていませんが、作成する必要がある新しいコードについては、TDDの概念に従うことを望んでいます。 今、どうしてコードを書くのに1日か2日以上かかるのかと聞かれるのは避けられないだろう、なぜなら私がやり取りすることの一部はすでにシステムに存在しているからだ))でコードをチェックすると、この「テスト」プロジェクトとは何かを尋ねられます。テストの基本を説明することはできますが、他の人が理解する方法で実際の利点を説明することはできません(テストは自分でアプリを実行する必要があると考えているためです。 " か否か)。彼らは疎結合の概念を理解していません(疎結合されたものは何もないという事実から明らかです。私が書いたコード以外のインターフェースすらありません)。それを利益として使用しようとすると、おそらく「ハァッ」を得るでしょう。ある種の見た目であり、既存のいくつかのモジュールを作り直さずに、おそらく「プログラミング」ではなく時間の浪費と見なされるIoCコンテナを導入することなく、やりたいほどゆるくすることはできません。 誰も私がこのコードを指す方法についての提案を持っていますか?私のものが悪いことを除いて)またはそれは時間の無駄のように見えることなく、実際の価値を追加しませんか?

9
理論上のTDDのみ
1年ちょっと前、幸運にも9か月の休憩をとることができました。その時に、C#のスキルを磨くことにしました。私は多くのプロジェクトに取り組み始め、TDDに従うことを余儀なくされました。 それはかなり啓発的なプロセスでした。 最初は大変でしたが、時間が経つにつれて、よりテスト可能なコードを作成する方法を学びました(実際には、よりソリッドなコードになる傾向があります)。 今、私は労働力に戻り、奇妙なことに気づいています。 私はTDDに従わないことを好みます。 TDDを使用すると速度が遅くなり、実際にクリーンなアプリケーションを設計するのが難しくなります。 代わりに、私はわずかに(大規模に)異なるアプローチを採用しました。 作業の垂直スライスを選択します 機能するプロトタイプを開発する すべてが整頓されるまでリファクタリングする 私が書いた美しく固くてテスト可能なコードに感謝します。 お気づきかもしれませんが、ステップ1は「テスト対象のパブリックサーフェスを定義する」わけではなく、ステップ2は「パブリックサーフェスからベジェスをテストする」わけではありません。また、どのステップにもテストが含まれていないことに気づいたかもしれません。私はテスト可能なコードを書いていますが、まだテストしていません...まだまだです。 ここで、実際にどのような種類のテストも行っていないことを明確にしたいと思います。私が書いているコードは動作します。手動でテストしているので機能します。 また、自動化されたすべてのテストを行っているわけでもないことを明確にしたいと思います。これは私のプロセスが異なるところです。そして、これが私がこの質問をする理由です。 理論的にはTDD。実際にはありません。 私のプロセスは少し進化しており、TDDと、非常に生産的で合理的に安全であると思われるテストとのバランスを取りました。次のようになります。 テストを念頭に置いて作業の垂直スライスを実装しますが、テストは作成しません。 そのスライスを修正する必要がある場合(1か月後など) 作業のスライスが正しいことを保証する単体テスト、統合テスト、動作テストなどを書く コードを修正する そのスライスを変更する必要がない場合、 何もしない テストを書く負担をコードを書く前から変更する前に単純にシフトすることで、はるかに機能するコードを生成することができました。そして、テストの作成に取り掛かるときには、作成するテストの数ははるかに少なくなりますが、ほぼ同じくらいの範囲(高いROI)をカバーします。 私はこのプロセスが好きですが、うまくスケールしないかもしれないと心配しています。その成功は、開発者が物事を変える前にテストを書くことに熱心であることにかかっています。そして、それはかなり大きなリスクのようです。しかし、TDDのリスクはまったく同じです。 だから、私は[BT] DD地獄に行くのですか、これは実用的なコーディングとテストの一般的な形式ですか? 私はこのように働き続けたいです。このプロセスを長期的に機能させるにはどうすればよいですか? 注意: 私は自分のプロジェクトの唯一の開発者であり、要件の収集、設計、アーキテクチャ、テスト、展開などすべてに責任があります。これが私のプロセスが機能している理由だと思います。

4
バグを修正するときは、常にユニットテストを行うべきですか?
バグを修正する場合、最初に特定のバグで失敗するテストを記述し、次にテストが合格するまでコードを修正することをお勧めします。これはTDDのプラクティスに従っており、良いプラクティスであると想定されていますが、実装に非常に近い不可解なテストを作成する傾向があることに気付きました。 たとえば、ジョブが送信され、特定の状態に到達し、中止され、再試行されたときに問題が発生しました。このバグを再現するために、スレッド同期、多くのモックなどを含む大規模なテストが作成されました...それは仕事をしましたが、コードをリファクタリングしているので、このマンモスを削除するだけで非常に魅力的です新しいデザインに合わせるには、本当に多くの作業が(再び)必要になります。そして、1つの特定のケースで1つの小さな機能をテストするだけです。 したがって、私の質問:再現が難しいバグをどのようにテストしますか?実装をテストし、リファクタリングと可読性を損なうものを作成しないようにするにはどうすればよいですか?
29 testing  tdd 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.