テストコードを本番環境に持ち込まないようにする
TL;DR: isTestingや同様のフラグを追加しないでください。
isTestingのようなフラグを追加すると、テストコードと本番コードが混在することになります。
これにより、テストでのみアクティブな隠しパスが作成されます。
また、実際の製品コードはカバーされません。
テスト動作を本番環境に配布すると、バグや予期しない動作が発生するリスクがあります。
struct PaymentService { is_testing: bool, } impl PaymentService { fn process_payment(&self, amount: f64) { if self.is_testing { println!("Testing mode: Skipping real payment"); return; } println!("Processing payment of ${}", amount); } }
trait PaymentProcessor { fn process(&self, amount: f64); } struct RealPaymentProcessor; impl PaymentProcessor for RealPaymentProcessor { fn process(&self, amount: f64) { println!("Processing payment of ${}", amount); } } struct TestingPaymentProcessor; impl PaymentProcessor for TestingPaymentProcessor { // Notice this is not a mock fn process(&self, _: f64) { println!("No payment: Skipping real transaction"); } } struct PaymentService<T: PaymentProcessor> { processor: T, } impl<T: PaymentProcessor> PaymentService<T> { fn process_payment(&self, amount: f64) { self.processor.process(amount); } }
この臭いは、 isTesting 、 environment == 'test' 、 DEBUG_MODEなどの条件フラグや、次のような慣用句を探すことで検出できます。
これらは、テストの動作が本番環境のコードに漏れていることを示しています。
テストコードと本番コードを明確に分離する必要があります。
これらを混在させると、現実世界の動作とプログラム間の一対一の全単射が崩れてしまいます。
環境は現実世界のエンティティであるため、 MAPPERで明示的にモデル化する必要があります。
AI によって生成されたコードでは、テストのために簡単なハックを使用すると、この臭いがすることがよくあります。
一部のツールでは、適切な設計よりも使いやすさを優先するため、 isTestingなどのフラグを提案します。
AI ツールは、テスト状態に基づいて条件付きロジックにフラグを立てるように構成すると、この臭いを検出できます。
覚えておいてください:AIアシスタントは多くの間違いを犯します
提案されたプロンプト: IsTestingメソッドを削除し、環境をモデル化して置き換えます
適切な指示がなければ | 具体的な指示 |
---|---|
isTestingフラグの使用は避けてください。
依存性注入を使用して環境をモデル化し、テスト ロジックと本番ロジックを分離します。
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxii
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xiii
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-vi-cmj31om
コードスメルは私の意見です。
写真はChristian GertenbachによるUnsplashより
テストフラグを追加すると、本番環境での信頼性が損なわれます。
ウォード・カニンガム
この記事は CodeSmell シリーズの一部です。