कुछ लोग यह सुनिश्चित करते हैं कि एकीकरण परीक्षण सभी प्रकार के बुरे और गलत हैं - सब कुछ यूनिट-परीक्षण होना चाहिए, जिसका अर्थ है कि आपको निर्भरता का मजाक उड़ाना होगा; एक विकल्प है, जो विभिन्न कारणों से, मैं हमेशा शौकीन नहीं हूँ।
मुझे लगता है कि, कुछ मामलों में, एक यूनिट-परीक्षण बस कुछ भी साबित नहीं करता है।
आइए एक उदाहरण के रूप में निम्नलिखित (तुच्छ, भोले) भंडार कार्यान्वयन (PHP में) करें:
class ProductRepository
{
private $db;
public function __construct(ConnectionInterface $db) {
$this->db = $db;
}
public function findByKeyword($keyword) {
// this might have a query builder, keyword processing, etc. - this is
// a totally naive example just to illustrate the DB dependency, mkay?
return $this->db->fetch("SELECT * FROM products p"
. " WHERE p.name LIKE :keyword", ['keyword' => $keyword]);
}
}
मान लीजिए कि मैं एक परीक्षण में साबित करना चाहता हूं कि यह भंडार वास्तव में विभिन्न दिए गए कीवर्ड से मेल खाने वाले उत्पाद पा सकता है।
एक वास्तविक कनेक्शन वस्तु के साथ एकीकरण परीक्षण के लघु, मैं कैसे जान सकता हूं कि यह वास्तव में वास्तविक प्रश्न उत्पन्न कर रहा है - और यह कि वास्तव में वे प्रश्न जो मुझे लगता है कि मैं क्या करता हूं?
अगर मुझे यूनिट-टेस्ट में कनेक्शन ऑब्जेक्ट को मॉक करना है, तो मैं केवल "यह अपेक्षित क्वेरी उत्पन्न करता है" जैसी चीजों को साबित कर सकता है - लेकिन इसका मतलब यह नहीं है कि यह वास्तव में काम करने वाला है ... अर्थात, शायद यह क्वेरी उत्पन्न कर रहा है। मुझे उम्मीद थी, लेकिन हो सकता है कि वह ऐसा न करे जो मुझे लगता है कि वह करता है।
दूसरे शब्दों में, मैं एक परीक्षण की तरह महसूस करता हूं जो उत्पन्न क्वेरी के बारे में जोर देता है, अनिवार्य रूप से मूल्य के बिना है, क्योंकि यह परीक्षण कर रहा है कि findByKeyword()
विधि कैसे लागू की गई थी , लेकिन यह साबित नहीं होता है कि यह वास्तव में काम करता है ।
यह समस्या रिपॉजिटरी या डेटाबेस एकीकरण तक सीमित नहीं है - यह बहुत से मामलों में लागू होता है, जहां मॉक (टेस्ट-डबल) के उपयोग के बारे में दावा करना केवल यह साबित करता है कि चीजों को कैसे लागू किया जाता है, न कि वे क्या करने जा रहे हैं वास्तव में काम करते हैं।
आप इन जैसी स्थितियों से कैसे निपटेंगे?
क्या इस तरह के मामले में एकीकरण परीक्षण वास्तव में "खराब" हैं?
मुझे यह बात मिलती है कि किसी एक चीज़ का परीक्षण करना बेहतर है, और मुझे यह भी समझ में आता है कि एकीकरण परीक्षण से असंख्य कोड-पथ क्यों बनते हैं, इन सभी का परीक्षण नहीं किया जा सकता है - लेकिन एक सेवा के मामले में (जैसे कि भंडार) जिसका एकमात्र उद्देश्य है किसी अन्य घटक के साथ बातचीत करने के लिए, आप वास्तव में एकीकरण परीक्षण के बिना कुछ भी कैसे परीक्षण कर सकते हैं?