एकीकरण और कार्यात्मक परीक्षण
वास्तविक परिस्थितियों में जाँचें कि घटक साथ मिलकर कैसे काम करते हैं।
एकीकरण और कार्यात्मक परीक्षण, CoddyKit पर PHP Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह PHP Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। PHP Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
यूनिट से आगे
यूनिट परीक्षण यह सिद्ध करते हैं कि कोई क्लास हर चीज़ को मॉक करके अलगाव में सही काम करती है। लेकिन मॉक गुमराह कर सकते हैं — वास्तविक डेटाबेस, ढाँचे का राउटर या एचटीटीपी परत अलग तरह से व्यवहार कर सकती है। एकीकरण परीक्षण आपस में जोड़े गए दो या अधिक वास्तविक घटकों की जाँच करते हैं; कार्यात्मक परीक्षण अनुप्रयोग के सार्वजनिक प्रवेश-बिंदु (एचटीटीपी अनुरोध या कंसोल कमांड) के माध्यम से पूरे अनुप्रयोग को शुरू से अंत तक चलाते हैं। यह पाठ दोनों का स्थान स्पष्ट करता है और उन्हें लिखना सिखाता है।
परीक्षण-पिरामिड
एक स्वस्थ परीक्षण-संग्रह पिरामिड के आकार का होता है:
- बहुत-से यूनिट परीक्षण — तेज़, अलग-थलग और लगातार चलाए जाते हैं।
- कम एकीकरण परीक्षण — वास्तविक डेटाबेस/कतार/कैश का उपयोग करते हैं और धीमे होते हैं।
- बहुत कम कार्यात्मक/पूर्ण-प्रवाह परीक्षण — पूरी परत पर चलते हैं, सबसे धीमे और सबसे अधिक नाज़ुक होते हैं।
इसे उलट देने पर (अधिकतर पूर्ण-प्रवाह परीक्षणों वाला 'आइसक्रीम-कोन') परीक्षण-संग्रह धीमा और अस्थिर हो जाता है। जहाँ संभव हो, कवरेज को निचले स्तरों पर रखें।
एकीकरण: वास्तविक डेटाबेस के विरुद्ध रिपॉज़िटरी
रिपॉज़िटरी का एकीकरण परीक्षण किसी मॉक के बजाय वास्तविक डेटाबेस कनेक्शन का उपयोग करता है, ताकि एसक्यूएल, स्कीमा और मैपिंग से जुड़ी त्रुटियाँ पकड़ी जा सकें। एक समर्पित परीक्षण डेटाबेस (या ऐसा मेमोरी-आधारित एसक्यूलाइट चुनें जो आपके वाक्यविन्यास से पर्याप्त रूप से मेल खाता हो) और वास्तविक PDO का उपयोग करें।
<?php
use PHPUnit\Framework\TestCase;
final class UserRepositoryTest extends TestCase
{
private \PDO $pdo;
protected function setUp(): void
{
$this->pdo = new \PDO('sqlite::memory:');
$this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$this->pdo->exec('CREATE TABLE users (id INTEGER PRIMARY KEY, email TEXT)');
}
public function test_persists_and_finds_a_user(): void
{
$repo = new UserRepository($this->pdo);
$id = $repo->create('ada@example.com');
self::assertSame('ada@example.com', $repo->find($id)->email);
}
}
पृथक्करण: लेन-देन वापस करना
एकीकरण परीक्षणों को एक-दूसरे में स्थिति नहीं छोड़नी चाहिए। सबसे तेज़ तरीका है कि हर परीक्षण को एक लेन-देन में लपेटें और tearDown() में उसे वापस कर दें — डेटाबेस को दोबारा डेटा भरे बिना साफ़ स्थिति में लौटाया जा सकता है। (जब परीक्षणाधीन कोड कमिट करता हो या DDL का उपयोग करता हो, तब तालिका खाली करना वैकल्पिक तरीका है।)
<?php
protected function setUp(): void
{
$this->pdo = TestDb::connection();
$this->pdo->beginTransaction();
}
protected function tearDown(): void
{
$this->pdo->rollBack(); // undo everything this test did
}
परीक्षण-डेटा और फ़ैक्टरियाँ
परीक्षणों को डेटा चाहिए। नाज़ुक और विशाल एसक्यूएल डंप से बचें; इसके बजाय छोटी फ़ैक्टरियों को प्राथमिकता दें, जो केवल परीक्षण के लिए आवश्यक पंक्तियाँ बनाएँ और जिनमें हर मामले के अनुसार बदले जा सकने वाले उचित डिफ़ॉल्ट हों। इससे हर परीक्षण का उद्देश्य स्पष्ट रहता है और स्कीमा बढ़ने पर भी वह टिकाऊ रहता है।
<?php
final class UserFactory
{
public static function create(\PDO $pdo, array $overrides = []): int
{
$data = array_merge(['email' => 'user'.uniqid().'@test.dev'], $overrides);
$stmt = $pdo->prepare('INSERT INTO users (email) VALUES (:email)');
$stmt->execute($data);
return (int) $pdo->lastInsertId();
}
}
कार्यात्मक: अनुप्रयोग को क्लाइंट की तरह चलाना
कार्यात्मक परीक्षण अनुकरण किए गए अनुरोध के साथ वास्तविक अनुप्रयोग कर्नेल/राउटर को चलाता है और प्रतिक्रिया — स्थिति कोड, हेडर तथा मुख्य भाग — पर जाँच करता है। सिम्फ़नी का WebTestCase और लारावेल के एचटीटीपी परीक्षण सहायक यही काम वास्तविक वेब सर्वर शुरू किए बिना करते हैं। नीचे सिम्फ़नी का रूप दिया गया है।
<?php
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
final class HealthControllerTest extends WebTestCase
{
public function test_health_endpoint_returns_ok(): void
{
$client = static::createClient();
$client->request('GET', '/health');
self::assertResponseIsSuccessful(); // 2xx
self::assertJson($client->getResponse()->getContent());
}
}
प्रतिक्रिया पर जाँच करना
कार्यात्मक परीक्षण सीमा पर दिखाई देने वाले व्यवहार की जाँच करते हैं: स्थिति, जेसन संरचना और डेटाबेस में होने वाले पार्श्व-प्रभाव। नीचे POST से एक संसाधन बनाया जाता है; हम एचटीटीपी प्रतिक्रिया और यह भी जाँचते हैं कि रिकॉर्ड वास्तव में भंडारण में पहुँचा है — इससे सिद्ध होता है कि पूरी परत ने मिलकर सही काम किया।
<?php
public function test_creating_a_user_persists_it(): void
{
$client = static::createClient();
$client->request('POST', '/users', server: [
'CONTENT_TYPE' => 'application/json',
], content: json_encode(['email' => 'ada@example.com']));
self::assertResponseStatusCodeSame(201);
$repo = static::getContainer()->get(UserRepository::class);
self::assertNotNull($repo->findByEmail('ada@example.com'));
}
सीमाओं को चुनिंदा रूप से नकली बनाना
कार्यात्मक परीक्षणों को भी वास्तविक भुगतान प्रदाताओं को नहीं बुलाना चाहिए और न ही वास्तविक ईमेल भेजने चाहिए। केवल सबसे बाहरी बाहरी सेवाओं को बदलें — परीक्षण कंटेनर में उनकी जगह नकली या मेमोरी-आधारित कार्यान्वयन लगाएँ — जबकि अपना कोड, रूटिंग और डेटाबेस वास्तविक रखें। इससे अस्थिर नेटवर्क अनुरोधों के बिना शुरू से अंत तक की विश्वसनीयता बनी रहती है।
<?php
public function test_checkout_charges_via_gateway(): void
{
$client = static::createClient();
// Replace the real gateway binding with an in-memory fake:
static::getContainer()->set(PaymentGateway::class, new FakePaymentGateway());
$client->request('POST', '/checkout', content: json_encode(['cart' => 1]));
self::assertResponseIsSuccessful();
}
अलग परीक्षण-संग्रह, अलग गति
अपने phpunit.xml को परीक्षण-संग्रहों में बाँटें, ताकि तेज़ यूनिट परीक्षण हर बार सहेजने पर चलें और धीमे एकीकरण/कार्यात्मक परीक्षण आवश्यकता होने पर या सीआई में चलें। निर्देशिका के आधार पर समूह बनाएँ और --testsuite से चुनें।
<phpunit>
<testsuites>
<testsuite name="unit">
<directory>tests/Unit</directory>
</testsuite>
<testsuite name="integration">
<directory>tests/Integration</directory>
</testsuite>
<testsuite name="functional">
<directory>tests/Functional</directory>
</testsuite>
</testsuites>
</phpunit>नियतता, कवरेज से अधिक महत्वपूर्ण
किसी परीक्षण-संग्रह पर से विश्वास उठाने का सबसे तेज़ तरीका उसका अस्थिर होना है। एकीकरण/कार्यात्मक परीक्षणों को नियत बनाएँ:
- समय को स्थिर करें (घड़ी दें),
time()को सीधे बुलाने के बजाय। - यादृच्छिकता का बीज निश्चित करें; बिना क्रम वाले प्रश्नों पर क्रम-निर्भर जाँचों से बचें।
- हर परीक्षण में डेटाबेस की स्थिति रीसेट करें (लेन-देन वापस करना / तालिका खाली करना)।
- परीक्षण चलने के क्रम पर कभी निर्भर न रहें।
परीक्षण डेटाबेस को उत्पादन से मिलाएँ
मेमोरी-आधारित एसक्यूलाइट तेज़ है, लेकिन वाक्यविन्यास के अंतर (अक्षर-संवेदनशीलता, जेसन फ़ंक्शन, विदेशी-कुंजी प्रवर्तन और प्रकार) उन त्रुटियों को छिपा सकते हैं जो केवल आपके वास्तविक इंजन पर सामने आती हैं। इंजन-विशिष्ट एसक्यूएल का उपयोग करने वाले कोड के लिए एकीकरण परीक्षण उत्पादन में प्रयुक्त उसी इंजन पर चलाएँ — आम तौर पर सीआई में एक अस्थायी डॉकर कंटेनर — न कि किसी सुविधाजनक विकल्प पर।
<?php
// Read connection from environment so CI points at a real Postgres/MySQL container
$dsn = getenv('TEST_DATABASE_URL') ?: 'sqlite::memory:';
$pdo = new \PDO($dsn);
$pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
// In CI, TEST_DATABASE_URL targets the same engine as production.
त्वरित जाँच
कार्यात्मक परीक्षण को तृतीय-पक्ष भुगतान प्रदाता के साथ कैसा व्यवहार करना चाहिए?
पुनरावलोकन
आपने घटकों को साथ मिलकर परीक्षण करना सीखा:
- एकीकरण परीक्षण वास्तविक डेटाबेस/सेवाओं का उपयोग करके उन समस्याओं को पकड़ते हैं जिन्हें मॉक छिपा देते हैं; लेन-देन वापस करके उन्हें अलग-थलग रखें।
- कार्यात्मक परीक्षण अनुकरण किए गए अनुरोधों के माध्यम से वास्तविक कर्नेल को चलाते हैं और प्रतिक्रियाओं तथा पार्श्व-प्रभावों की जाँच करते हैं।
- फ़ैक्टरियाँ न्यूनतम डेटा बनाती हैं; केवल सबसे बाहरी बाहरी सीमाओं को नकली बनाएँ।
- परीक्षण-संग्रहों को गति के आधार पर बाँटें और धीमे परीक्षणों को नियत बनाए रखें।
अगला विषय: म्यूटेशन परीक्षण के माध्यम से परीक्षणों की गुणवत्ता मापना।
एआई शिक्षक के साथ PHP सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 49
- पाठ
- 195
अक्सर पूछे जाने वाले प्रश्न
क्या “एकीकरण और कार्यात्मक परीक्षण” पाठ निःशुल्क है?
हाँ—“एकीकरण और कार्यात्मक परीक्षण” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और PHP Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। PHP Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“एकीकरण और कार्यात्मक परीक्षण” में मैं क्या सीखूँगा?
वास्तविक परिस्थितियों में जाँचें कि घटक साथ मिलकर कैसे काम करते हैं। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ PHP Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या PHP Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर PHP Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“एकीकरण और कार्यात्मक परीक्षण” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस PHP Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर PHP Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- टेस्ट-ड्रिवन डेवलपमेंट वर्कफ़्लो
- Mockery के साथ मॉकिंग और स्टबिंग
- एकीकरण और कार्यात्मक परीक्षण
- Infection के साथ म्यूटेशन परीक्षण