testing

8 posts

テストカバレッジ94%でも見逃した整数オーバーフローを、symbolic executionが発見した

ユニットテストは特定の入力をチェックする。symbolic executionはあらゆる可能な入力をチェックする。仕組み、コスト、始め方を解説する。

テストスイートのカバレッジは94%で、失敗はゼロだ。symbolic executionエンジンは3秒未満でコードのクラッシュを発見する。 テストは壊れていない。カバレッジメトリックが嘘をついているわけでもない。問題は、テストが特定の地点での振る舞いを検証するのに対し、symbolic…

Metamorphic testingがGCCとLLVMで147件のコンパイラバグ、自動運転車の重大欠陥を発見した。その仕組みを解説する

Metamorphic testingはGCC、LLVM、Vulkanシェーダコンパイラ、ADASシミュレータで実際のバグを発見してきた。この記事では、その手法を実行可能なコードとともに解説し、あなたのテストスイートのどこに位置づけるべきかを示す。

Metamorphic testingはGCCとLLVMで147件の確認済みバグ、自動車OEMが使用する商用ADASシミュレータの欠陥、そして歩行者を轢き殺す8日前に自動運転車の認識システムにおいて致命的な欠陥を発見した。この手法は学術的に聞こえるが、バグは学術的ではない。 問題はoracle…

多くのMetamorphic Relationsは役に立たない。優れたものを選ぶ方法。

すべてのmetamorphic relationsがバグを捉えるわけではない。弱いrelationは虚偽の自信を与え、強いrelationだけが本当の欠陥を見つける。どう違いを見分け、実際に機能するrelationセットを構築するかを解説する。

価格設定エンジン向けに12個のmetamorphic relationsを書いた。すべてのテストが通過した。カバレッジに自信を持っている。…

正解がわからないコードはどうテストする?

Metamorphic testingを使えば、正しい出力が何かを知らなくてもコードの正しさを検証できる。その仕組み、限界、そして使い始める方法を解説する。

機械学習モデルをリリースした。サポートチケットにラベルを付与するものだ。テストスイートはグリーンだ。すべてのテストが通過した。…

テスト、コード、散文を1つのMarkdownファイルにまとめて、ドキュメントへのコードコピーをやめた

Literate programmingは、Markdownファイルをsingle source of truthにすることで、ドキュメント、テスト、実装を同期させ続ける。Python30行で実装する方法を紹介する。

ドキュメント、テスト、コードは、同じことをまともに語れない3つのファイルだ。 ソースの関数シグネチャを更新する。READMEのサンプルを忘れる。1週間後、新入社員が古くなったスニペットを本番にコピーする。テストファイルはまだ古い動作を期待結果としてエンコードしている。これでバグが2つ、ドキュメントチケットが1つだ。…

race conditionを待つのは最悪のテスト戦略だ

model checkingが、concurrency bugを発見するためにアプリを数日間実行することをどう凌駕するか、そして自分のコードにどう応用するか。

productionでrace conditionが出るのを待つのは、テストじゃない。勤勉のフリをした希望だ。 アプリを何週間も走らせ、metrics dashboardを見張っていても、2つのrequestがまさに同じcache eviction windowに突入したときだけ発火するconcurrency…

ユニットテストは通るのに、データは消えている

モック化されたデータベースのテストはSQLの構文を検証するだけで、クラッシュや並列書き込み、スキーマの不整合を経ても行が存続するかどうかは検証しない。永続性を本気でテストする方法を紹介する。

テストでデータベースをモック化していると、リポジトリ層が正しいメソッドを呼び出しているかどうかをテストしているに過ぎない。クラッシュからデータが復元されるか、ユニーク制約が実際に重複をブロックするか、何かが失敗したときにトランザクションがロールバックされるかどうかはテストできていない。…

モックアクションだらけにならずにReduxをテストする

すべてのReduxアクションをモックすると、テストは変更履歴の検証ツールになってしまう。実際の状態遷移を使ってストアをテストする方法を紹介する。

が正確なペイロードの形で呼ばれたかどうかを検証するテストを書いたことがあるなら、それは誰かが定数の名前を変更するたびに壊れるテストを書いたということです。 それは状態のロジックをテストしているのではありません。あなたの指が正しい文字列を打ったかどうかをテストしているだけです。…