क्या आपको सभी यूनिट परीक्षणों में अपने डेटा को हार्ड कोड करना चाहिए?


33

अधिकांश यूनिट परीक्षण ट्यूटोरियल / उदाहरणों में आमतौर पर प्रत्येक व्यक्तिगत परीक्षण के लिए परीक्षण किए जाने वाले डेटा को परिभाषित करना शामिल होता है। मुझे लगता है कि यह "सब कुछ अलगाव में परीक्षण किया जाना चाहिए" सिद्धांत का हिस्सा है।

हालाँकि मैंने पाया है कि जब बहुत सारे DI के साथ मल्टीटियर अनुप्रयोगों के साथ काम किया जाता है , तो प्रत्येक परीक्षण को स्थापित करने के लिए आवश्यक कोड बहुत लंबे हो जाते हैं। इसके बजाय मैंने कई टेस्टबेस क्लास बनाए हैं, जो अब मुझे विरासत में मिल सकते हैं, जिनमें बहुत सारे टेस्ट मचान प्री-बिल्ट हैं।

इस के हिस्से के रूप में, मैं नकली डेटासेट भी बना रहा हूं, जो एक चल रहे एप्लिकेशन के डेटाबेस का प्रतिनिधित्व करता है, यद्यपि आमतौर पर प्रत्येक "टेबल" में केवल एक या दो पंक्तियों के साथ।

क्या यह पूर्वनिर्धारित करने के लिए एक स्वीकृत अभ्यास है, यदि सभी नहीं है, तो सभी इकाई परीक्षणों में परीक्षण डेटा का बहुमत है?

अद्यतन करें

नीचे दी गई टिप्पणियों से ऐसा लगता है कि मैं इकाई परीक्षण की तुलना में अधिक एकीकरण कर रहा हूं।

मेरी वर्तमान परियोजना ASP.NET MVC है, इकाई फ्रेमवर्क कोड प्रथम पर कार्य की इकाई का उपयोग कर, और परीक्षण के लिए Moq। मैंने यूओडब्ल्यू, और रिपॉजिटरी का मजाक उड़ाया है, लेकिन मैं वास्तविक व्यापार तर्क कक्षाओं का उपयोग कर रहा हूं, और नियंत्रक क्रियाओं का परीक्षण कर रहा हूं। परीक्षण अक्सर जाँच करेंगे कि UoW प्रतिबद्ध है, उदाहरण के लिए:

[TestClass]
public class SetupControllerTests : SetupControllerTestBase {
  [TestMethod]
  public void UserInvite_ExistingUser_DoesntInsertNewUser() {
    // Arrange
    var model = new Mandy.App.Models.Setup.UserInvite() {
      Email = userData.First().Email
    };

    // Act
    setupController.UserInvite(model);

    // Assert
    mockUserSet.Verify(m => m.Add(It.IsAny<UserProfile>()), Times.Never);
    mockUnitOfWork.Verify(m => m.Commit(), Times.Once);
  }
}

SetupControllerTestBaseमॉक यूओडब्ल्यू का निर्माण कर रहा है, और इंस्टेंटिंग कर रहा है userLogic

डेटाबेस में बहुत सारे परीक्षणों के लिए एक मौजूदा उपयोगकर्ता या उत्पाद की आवश्यकता होती है, इसलिए मैंने पूर्व-पॉप्युलेट किया है कि नकली यूओडब्ल्यू क्या है, इस उदाहरण में userData, जो कि IList<User>एक एकल उपयोगकर्ता रिकॉर्ड के साथ है।


4
ट्यूटोरियल / उदाहरण के साथ समस्या यह है कि उन्हें सरल होने की आवश्यकता है, लेकिन आप एक सरल उदाहरण पर एक जटिल समस्या का समाधान नहीं दिखा सकते हैं। उन्हें "केस स्टडी" के साथ यह वर्णन करना चाहिए कि उपकरण का उपयोग उचित आकार की वास्तविक परियोजनाओं में कैसे किया जाता है, लेकिन वे शायद ही कभी होते हैं।
Jan Hudec

हो सकता है कि आपके पास कोड के कुछ छोटे उदाहरण हों, जिनके बारे में आप पूरी तरह से खुश नहीं हैं।
ल्यूक फ्रेंकेन

यदि आपको परीक्षण चलाने के लिए बहुत सारे सेटअप कोड की आवश्यकता है तो आप एक कार्यात्मक परीक्षण चलाने का जोखिम उठा सकते हैं। यदि आप कोड बदलते समय परीक्षण विफल हो जाता है लेकिन कोड में कुछ भी गलत नहीं है। यह निश्चित रूप से एक कार्यात्मक परीक्षण है।
रिएक्टगुलर

"XUnit टेस्ट पैटर्न" पुस्तक पुन: प्रयोज्य जुड़नार और सहायकों के लिए एक मजबूत मामला बनाती है। टेस्ट कोड किसी भी अन्य कोड के समान ही होना चाहिए।
चक क्रट्सिंगर

यह लेख सहायक हो सकता है: yegor256.com/2015/05/25/unit-test-scaffolding.html
yegor256

जवाबों:


25

अंततः, आप जितना संभव हो उतना कम परिणाम प्राप्त करने के लिए जितना संभव हो उतना कम कोड लिखना चाहते हैं। कई परीक्षणों में समान कोड होने के कारण क) कॉपी-पेस्ट कोडिंग और बी में परिणाम होता है) का अर्थ है कि यदि एक विधि हस्ताक्षर बदलता है तो आप बहुत सारे टूटे हुए परीक्षणों को ठीक करने के लिए समाप्त हो सकते हैं।

मैं मानक टेस्ट हेल्पर कक्षाएं होने के दृष्टिकोण का उपयोग करता हूं जो मुझे बहुत सारे डेटा प्रकार प्रदान करता है जो मैं नियमित रूप से उपयोग करता हूं, इसलिए मैं अपने परीक्षणों के प्रश्न के लिए मानक इकाई या डीटीओ कक्षाओं के सेट बना सकता हूं और यह जान सकता हूं कि मुझे हर बार क्या मिलेगा। इसलिए मैं TestHelper.GetFooRange( 0, 100 )अपने सभी आश्रित वर्गों / क्षेत्रों के साथ 100 फू वस्तुओं की एक श्रृंखला प्राप्त करने के लिए कॉल कर सकता हूं ।

विशेष रूप से जहां ओआरएम प्रकार प्रणाली में जटिल संबंध कॉन्फ़िगर किए गए हैं जो चीजों को सही ढंग से चलाने के लिए मौजूद होने की आवश्यकता है, लेकिन इस परीक्षण के लिए जरूरी नहीं है कि यह बहुत समय बचा सकता है।

उन स्थितियों में जहां मैं डेटा स्तर के करीब परीक्षण कर रहा हूं, मैं कभी-कभी अपने रिपॉजिटरी वर्ग का एक परीक्षण संस्करण बनाता हूं जिसे एक समान तरीके से फिर से तैयार किया जा सकता है (फिर से यह एक ORM प्रकार के वातावरण में है, और यह एक के खिलाफ प्रासंगिक नहीं होगा वास्तविक डेटाबेस), क्योंकि प्रश्नों के सटीक जवाबों का मजाक उड़ाना बहुत काम का है और अक्सर केवल मामूली लाभ प्रदान करता है।

इकाई परीक्षणों में हालांकि कुछ बातों का ध्यान रखना चाहिए:

  • सुनिश्चित करें कि आपके mocks हैं mocks । यदि आप इकाई परीक्षण कर रहे हैं, तो जिन कक्षाओं का परीक्षण किया जा रहा है, उनके आस-पास संचालन करने वाली कक्षाएं मॉक ऑब्जेक्ट होनी चाहिए । आपका DTO / निकाय प्रकार की कक्षाएं वास्तविक चीज़ हो सकती हैं, लेकिन यदि कक्षाएं संचालन कर रही हैं, तो आपको उनका मज़ाक उड़ाना होगा- अन्यथा जब सहायक कोड बदलता है और आपके परीक्षण विफल होने लगते हैं, तो आपको यह पता लगाने के लिए बहुत अधिक समय तक खोजना होगा कि कौन सा परिवर्तन है वास्तव में समस्या का कारण बना।
  • सुनिश्चित करें कि आप अपनी कक्षाओं का परीक्षण कर रहे हैं । कभी-कभी यदि कोई यूनिट परीक्षणों के एक सूट के माध्यम से देखता है, तो यह स्पष्ट हो जाता है कि परीक्षण के आधे वास्तव में नकली कोड का परीक्षण कर रहे हैं जो कि वास्तविक परीक्षण से अधिक होना चाहिए।
  • मॉक / सपोर्टिंग ऑब्जेक्ट का पुन: उपयोग न करें यह एक बड़ी बात है- जब कोई कोड सपोर्टिंग यूनिट परीक्षणों के साथ चतुर होने की कोशिश करने लगता है तो अनजाने में उन वस्तुओं को बनाना आसान होता है जो परीक्षणों के बीच बनी रहती हैं, जिनके अप्रत्याशित प्रभाव हो सकते हैं। उदाहरण के लिए, कल मेरे पास एक परीक्षण था जो अपने दम पर चलने पर पास हो गया, जब कक्षा में सभी परीक्षण चलाए गए, लेकिन पूरा परीक्षण सूट चलने पर विफल हो गया। यह पता चला है कि वहाँ एक परीक्षण सहायक में एक डरपोक स्थिर वस्तु रास्ता था कि, जब मैं इसे बनाया, निश्चित रूप से एक समस्या का कारण कभी नहीं होगा बस याद रखें: परीक्षण की शुरुआत में, सब कुछ बनाया जाता है, परीक्षण के अंत में सब कुछ नष्ट हो जाता है।

10

जो कुछ भी आपके परीक्षण के इरादे को और अधिक पठनीय बनाता है।

अंगूठे के एक सामान्य नियम के रूप में:

यदि डेटा परीक्षण का हिस्सा है (जैसे। 7 की स्थिति के साथ पंक्तियों को प्रिंट नहीं करना चाहिए) तो इसे परीक्षण में कोड करें, ताकि यह स्पष्ट हो जाए कि लेखक का क्या होने का इरादा है।

यदि डेटा सिर्फ भरने के लिए है, तो यह सुनिश्चित करें कि इसके साथ काम करने के लिए कुछ है (जैसे कि रिकॉर्ड को पूर्ण नहीं होना चाहिए यदि प्रसंस्करण सेवा अपवाद फेंकता है) तो हर तरह से एक BuildDummyData विधि या एक परीक्षण वर्ग होता है जो अप्रासंगिक डेटा को परीक्षण से बाहर रखता है। ।

लेकिन ध्यान दें कि मैं बाद के एक अच्छे उदाहरण के बारे में सोचने के लिए संघर्ष कर रहा हूं। यदि आपके पास एक इकाई-परीक्षण स्थिरता में इनमें से कई हैं, तो आपको हल करने के लिए संभवतः एक अलग समस्या है ... शायद परीक्षण के तहत विधि बहुत जटिल है।


+1 मैं सहमत हूं। यह बदबू आ रही है जैसे कि वह परीक्षण कर रहा है, यूनिट परीक्षण के लिए कसकर युग्मित है।
रिएक्टगुलर

5

परीक्षण के विभिन्न तरीके

पहले परिभाषित करें कि आप क्या कर रहे हैं: इकाई परीक्षण या एकीकरण परीक्षण । परतों की संख्या इकाई परीक्षण के लिए अप्रासंगिक है क्योंकि आप केवल एक वर्ग की सबसे अधिक संभावना का परीक्षण करते हैं। बाकी आप मजाक उड़ाते हैं। एकीकरण परीक्षण के लिए यह अपरिहार्य है कि आप कई परतों का परीक्षण करें। यदि आपके पास अच्छी यूनिट के परीक्षण हैं तो चाल को एकीकरण परीक्षणों को बहुत जटिल नहीं बनाना है।

यदि आपकी इकाई परीक्षण अच्छे हैं तो आपको एकीकरण परीक्षण करते समय सभी विवरणों का परीक्षण करने की आवश्यकता नहीं है।

हम जिन शब्दों का उपयोग करते हैं, वे थोड़े से प्लेटफ़ॉर्म पर निर्भर हैं, लेकिन आप उन्हें लगभग सभी परीक्षण / विकास प्लेटफार्मों में पा सकते हैं:

उदाहरण आवेदन

आप जिस तकनीक का उपयोग करते हैं उसके आधार पर नामों में अंतर हो सकता है, लेकिन मैं इसका उपयोग एक उदाहरण के रूप में करूंगा:

यदि आपके पास मॉडल उत्पाद, ProductsController और एक सूचकांक दृश्य के साथ एक साधारण CRUD अनुप्रयोग है जो उत्पादों के साथ एक HTML तालिका बनाता है:

एप्लिकेशन का अंतिम परिणाम उन सभी उत्पादों की सूची के साथ एक HTML तालिका दिखा रहा है जो सक्रिय हैं।

इकाई का परीक्षण

आदर्श

जिस मॉडल को आप काफी आसानी से परख सकते हैं। इसके लिए अलग-अलग तरीके हैं; हम जुड़नार का उपयोग करें। मुझे लगता है कि जिसे आप "नकली डेटासेट" कहते हैं। इसलिए प्रत्येक परीक्षण चलाने से पहले हम तालिका बनाते हैं, और मूल डेटा में डालते हैं। अधिकांश प्लेटफार्मों में इसके लिए तरीके हैं। उदाहरण के लिए, आपके परीक्षण वर्ग में, एक विधि सेटअप () जो प्रत्येक परीक्षण से पहले चलाया जाता है।

फिर हम अपना परीक्षण चलाते हैं, उदाहरण के लिए: testGetAllActive उत्पाद।

इसलिए हम सीधे एक परीक्षण डेटाबेस पर परीक्षण करते हैं। हम डेटा स्रोत का मजाक नहीं उड़ाते हैं; हम इसे हमेशा समान बनाते हैं। यह हमें उदाहरण के लिए डेटाबेस के नए संस्करण के साथ परीक्षण करने की अनुमति देता है, और कोई भी क्वेरी समस्याएँ आएंगी।

वास्तविक दुनिया में आप हमेशा 100% एकल जिम्मेदारी का पालन नहीं कर सकते हैं । यदि आप इसे और भी बेहतर करना चाहते हैं तो आप एक डेटा स्रोत का उपयोग कर सकते हैं, जिसका आप मजाक उड़ाते हैं। हमारे लिए (हम एक ORM का उपयोग करते हैं) जो पहले से मौजूद तकनीक का परीक्षण करने जैसा लगता है। इसके अलावा परीक्षण बहुत अधिक जटिल हो जाते हैं, और वे वास्तव में प्रश्नों का परीक्षण नहीं करते हैं। तो हम इसे इस तरह से रखते हैं।

हार्ड कोडित डेटा को अलग से जुड़नार में संग्रहीत किया जाता है। तो स्थिरता बनाने के लिए एक SQL फ़ाइल की तरह है जिसमें एक तालिका विवरण और हमारे द्वारा उपयोग किए जाने वाले रिकॉर्ड के लिए आवेषण है। हम उन्हें छोटा रखते हैं जब तक कि बहुत सारे रिकॉर्ड के साथ परीक्षण करने की वास्तविक आवश्यकता न हो।

class ProductModel {
  public function getAllActive() {
    return $this->find('all', array('conditions' => array('active' => 1)));
  }
}

नियंत्रक

नियंत्रक को अधिक काम करने की आवश्यकता है, क्योंकि हम इसके साथ मॉडल का परीक्षण नहीं करना चाहते हैं। तो हम जो करते हैं वह है मॉडल का मजाक उड़ाना। इसका मतलब है: हम परीक्षण करते हैं: सूचकांक () विधि जो रिकॉर्ड की एक सूची वापस करना चाहिए।

इसलिए हम मॉडल मेथड getAllActive () को मॉक करते हैं और इसमें निश्चित डेटा (उदाहरण के लिए दो रिकॉर्ड) जोड़ते हैं। अब हम नियंत्रक को दृश्य में भेजे जाने वाले डेटा का परीक्षण करते हैं, और हम तुलना करते हैं कि क्या हम वास्तव में उन दो रिकॉर्डों को वापस प्राप्त करते हैं।

function testProductIndexLoggedIn() {
  $this->setLoggedIn();
  $this->ProductsController->mock('ProductModel', 'index', function(return array(your records) ));
  $result=$this->ProductsController->index();
  $this->assertEquals(2, count($result['products']));
}

बस काफी है। हम नियंत्रक के रूप में कम कार्यक्षमता जोड़ने की कोशिश करते हैं क्योंकि यह कठिन परीक्षण करता है। लेकिन निश्चित रूप से इसमें हमेशा कुछ कोड होता है। उदाहरण के लिए, हम आवश्यकताओं का परीक्षण करते हैं: यदि आप लॉग इन हैं तो केवल उन दो रिकॉर्ड को दिखाएं।

तो, नियंत्रक को सामान्य रूप से एक नकली और हार्डकोड डेटा का एक छोटा टुकड़ा चाहिए। एक लॉगिन प्रणाली के लिए शायद एक और एक। हमारे परीक्षण में हमारे पास इसके लिए एक सहायक विधि है: setLoggedIn ()। यह लॉगिन या बिना लॉगिन के साथ परीक्षण करना सरल बनाता है।

class ProductsController {
  public function index() {
    if($this->loggedIn()) {
      $this->set('products', $this->ProductModel->getAllActive());
    }
  }
}

दृश्य

दृश्य परीक्षण कठिन है। पहले हम तर्क को अलग करते हैं जो दोहराता है। हम इसे हेल्पर्स में डालते हैं और उन कक्षाओं का कड़ाई से परीक्षण करते हैं। हम हमेशा एक ही आउटपुट की उम्मीद करते हैं। उदाहरण के लिए, generateHtmlTableFromArray ()।

फिर हमारे पास कुछ परियोजना विशिष्ट विचार हैं। हम उन का परीक्षण नहीं करते हैं। यह वास्तव में यूनिट परीक्षण करने के लिए वांछित नहीं है। हम उन्हें एकीकरण परीक्षणों के लिए रखते हैं। क्योंकि हमने बहुत सारे कोड को अपने विचार में निकाल लिया है, इसलिए हमारे यहाँ जोखिम कम है।

यदि आप हर बार जब आप HTML का एक टुकड़ा बदलते हैं, तो आपके परीक्षण बदलने की आवश्यकता होती है, जो कि अधिकांश परियोजनाओं के लिए उपयोगी नहीं है, तो आप उनका परीक्षण करना शुरू करते हैं।

echo $this->tableHelper->generateHtmlTableFromArray($products);

एकीकरण जांच

आपके द्वारा यहां दिए गए प्लेटफॉर्म के आधार पर आप उपयोगकर्ताओं की कहानियों आदि के साथ काम कर सकते हैं। इसे सेलेनियम या अन्य तुलनीय समाधानों की तरह वेबबेस किया जा सकता है ।

आम तौर पर हम बस डेटाबेस को जुड़नार के साथ लोड करते हैं और दावा करते हैं कि कौन सा डेटा उपलब्ध होना चाहिए। पूर्ण एकीकरण परीक्षण के लिए हम आम तौर पर बहुत वैश्विक आवश्यकताओं का उपयोग करते हैं। तो: उत्पाद को सक्रिय पर सेट करें और फिर देखें कि क्या उत्पाद उपलब्ध है।

हम सब कुछ फिर से परीक्षण नहीं करते हैं, जैसे कि सही फ़ील्ड उपलब्ध हैं। हम यहां बड़ी आवश्यकताओं का परीक्षण करते हैं। चूंकि हम नियंत्रक या दृश्य से हमारे परीक्षणों की नकल नहीं करना चाहते हैं। यदि कोई चीज आपके आवेदन के लिए या सुरक्षा कारणों से वास्तव में कुंजी / मुख्य भाग है (चेक पासवर्ड उपलब्ध नहीं है) तो हम उन्हें यह सुनिश्चित करने के लिए जोड़ते हैं कि यह सही है।

हार्ड कोडित डेटा को जुड़नार में संग्रहीत किया जाता है।

function testIntegrationProductIndexLoggedIn() {
  $this->setLoggedIn();
  $result=$this->request('products/index');

  $expected='<table';
  $this->assertContains($expected, $result);

  // Some content from the fixture record
  $expected='<td>Product 1 name</td>';
  $this->assertContains($expected, $result);
}

यह एक महान जवाब है, एक पूरी तरह से अलग सवाल के लिए।
पीडीआर

प्रतिक्रिया के लिए धन्यवाद। आप सही हो सकते हैं कि मैंने इसका उल्लेख भी नहीं किया है। क्रिया के उत्तर का कारण यह है क्योंकि मैं पूछे गए प्रश्न में परीक्षण करते समय सबसे कठिन चीजों में से एक देखता हूं। अलगाव में परीक्षण का अवलोकन विभिन्न प्रकार के परीक्षणों के साथ फिट बैठता है। इसलिए मैंने हर हिस्से में जोड़ा कि कैसे डेटा को हैंडल किया जाता है (या अलग किया जाता है)। यह देखने के लिए एक नज़र डालेंगे कि क्या मैं इसे और अधिक स्पष्ट कर सकता हूं।
ल्यूक फ्रेंकेन

उत्तर को कुछ कोड उदाहरणों के साथ अपडेट किया गया है ताकि यह समझाया जा सके कि सभी प्रकार की अन्य कक्षाओं को कॉल किए बिना कैसे परीक्षण किया जाए।
ल्यूक फ्रेंकेन

4

यदि आप ऐसे परीक्षण लिख रहे हैं जिनमें बहुत सारे DI और वायरिंग शामिल हैं, तो "वास्तविक" डेटा स्रोत का उपयोग करने तक, आपने संभवतः सादे इकाई परीक्षण का क्षेत्र छोड़ दिया और एकीकरण परीक्षण के क्षेत्र में प्रवेश किया।

एकीकरण परीक्षणों के लिए, मुझे लगता है, सामान्य डेटा सेटअप लॉजिक होना बुरा नहीं है। ऐसे परीक्षणों का मुख्य लक्ष्य यह साबित करना है कि सब कुछ सही ढंग से कॉन्फ़िगर किया गया है। यह आपके सिस्टम के माध्यम से भेजे गए ठोस डेटा के बजाय स्वतंत्र है।

दूसरी ओर यूनिट परीक्षणों के लिए, मैं परीक्षण कक्षा के लक्ष्य को "वास्तविक" वर्ग रखने का सुझाव दूंगा और बाकी सभी चीजों का मजाक उड़ाऊंगा। फिर आपको परीक्षण डेटा को वास्तव में हार्ड-कोड करना चाहिए ताकि आप यह सुनिश्चित कर सकें कि आपने कई विशेष / पिछले-बग रास्तों को कवर किया है।

परीक्षणों के लिए एक अर्ध-कठोर-कोडित / यादृच्छिक तत्व जोड़ने के लिए, मुझे यादृच्छिक मॉडल कारखानों को पेश करना पसंद है। अपने मॉडल के उदाहरण का उपयोग करके एक परीक्षण में, मैं फिर इन कारखानों का उपयोग एक वैध, लेकिन पूरी तरह से यादृच्छिक मॉडल ऑब्जेक्ट और फिर हार्ड-कोड केवल उन गुणों के लिए करता हूं जो परीक्षण के लिए रुचि रखते हैं। इस तरह आप अपने परीक्षण में सीधे सभी प्रासंगिक डेटा निर्दिष्ट करते हैं, जबकि आप सभी अप्रासंगिक डेटा और (एक निश्चित डिग्री तक) परीक्षण को निर्दिष्ट करने की आवश्यकता को भी बचाते हैं कि अन्य मॉडल फ़ील्ड पर कोई अनपेक्षित निर्भरता नहीं हैं।


-1

मुझे लगता है कि आपके परीक्षणों के लिए डेटा के अधिकांश कोड के लिए यह बहुत आम है।

एक साधारण स्थिति पर विचार करें जहां एक विशेष डेटा सेट बग होने का कारण बनता है। आप उस डेटा को ठीक करने के लिए विशेष रूप से एक इकाई परीक्षण बना सकते हैं और यह सुनिश्चित कर सकते हैं कि बग वापस नहीं आता है। समय के साथ आपके परीक्षणों में डेटा का एक सेट होगा जो कई परीक्षण मामलों को कवर करता है।

पूर्वनिर्धारित परीक्षण डेटा आपको डेटा का एक सेट बनाने की अनुमति देता है जो स्थितियों की एक विस्तृत और ज्ञात सीमा को कवर करता है।

उस ने कहा, मुझे लगता है कि आपके परीक्षणों में कुछ यादृच्छिक डेटा होने का भी मूल्य है।


क्या आपने वास्तव में सवाल पढ़ा और न कि केवल शीर्षक से?
जैकब

आपके परीक्षणों में कुछ यादृच्छिक डेटा होने का मूल्य - हाँ, कारण यह है कि यह पता लगाने की कोशिश करने जैसा कुछ भी नहीं है कि एक परीक्षण में ऐसा क्या हुआ है जो हर हफ्ते विफल हो जाता है।
पीडीआर

आपके परीक्षणों में रेंकिंग / फ़ज़िंग / इनपुट परीक्षणों के लिए यादृच्छिक डेटा होने का मूल्य है। लेकिन आपकी इकाई परीक्षणों में नहीं, यह एक बुरा सपना होगा।
ग्लेनट्रॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.