PgTAP के साथ संग्रहीत कार्यों का परीक्षण

मैंने हाल ही में एक डेटा स्कीमा के "कंकाल" के साथ एक लेख पोस्ट किया है जिसका उपयोग आप अपने PostgreSQL स्कीमा बनाने के लिए कर सकते हैं।
सर्किट को तैनात करने, ऑब्जेक्ट बनाने के लिए स्क्रिप्ट के अलावा, उन पर संग्रहीत कार्यों और यूनिट परीक्षणों के उदाहरण थे।



इस लेख में, मैं एक उदाहरण के रूप में pg_skeleton का उपयोग करना चाहता हूं कि कैसे pgTAP का उपयोग करके पोस्टग्रेएसक्यूएल संग्रहीत कार्यों के लिए परीक्षण लिखना है।

PgTAP परीक्षण, जैसा कि नाम से पता चलता है, सादा पाठ प्रारूप TAP में परीक्षण पाठ (कुछ भी प्रोटोकॉल) । यह प्रारूप कई CI सिस्टम द्वारा स्वीकार किया जाता है। हम Jenkins TAP Plugin का उपयोग कर रहे हैं।

एक्सटेंशन स्थापित करते समय, संग्रहीत फ़ंक्शन डेटाबेस में निर्मित होते हैं (सार्वजनिक योजना में डिफ़ॉल्ट रूप से), जिसका उपयोग हम परीक्षण लिखते समय करेंगे। अधिकांश कार्य विभिन्न मुखर हैं। पूरी सूची यहां देखी जा सकती है: http://pgtap.org/documentation.html

हम test_user उदाहरण सर्किट से कार्यों का परीक्षण करेंगे:
पहले pg_skeleton स्थापित करें । (यदि आप तुरंत अपने सर्किट में परीक्षण लिखना चाहते हैं, तो pg_skeleton के इंस्टॉलेशन निर्देशों से, केवल pgtap भाग करें और डेटाबेस में एक्सटेंशन लोड करें)

मैंने वास्तविक परियोजनाओं में उपयोग किए जाने वाले परीक्षणों के समान बनाने की कोशिश की, और अधिक भिन्न pgTAP कार्यों का उपयोग किया।
परीक्षण शुरू करने से पहले, आपको योजना (इंट) फ़ंक्शन को कॉल करके उनकी संख्या निर्दिष्ट करनी होगी।
हमारे उदाहरण में, यह कॉल फ़ाइल परीक्षण / परीक्षण / run_user.sql में है:
select plan(7+2+1); 

इस स्थिति में, 7 user_crud.sql फ़ाइल (परीक्षण f) से चलाए जाने वाले परीक्षणों की संख्या है, 2 user_schema.sql फ़ाइल में परीक्षणों की संख्या है, 1 एक-लाइन परीक्षण (परीक्षण द्वारा कार्यों की कवरेज की जाँच करना) सीधे run_user.sql फ़ाइल में है।
PgTAP प्रलेखन मुख्य रूप से अलग-अलग चुनिंदा प्रश्नों द्वारा बुलाए गए परीक्षणों से संबंधित है - यह सर्किट के परीक्षण के लिए उपयुक्त है, या साधारण कार्यों की जांच करने के लिए जिनके दुष्प्रभाव नहीं हैं (ऐसे परीक्षण user_schema.sql में हैं)।
लेकिन जटिल परिदृश्यों का परीक्षण करते समय, जब कई फ़ंक्शन को कॉल करना आवश्यक होता है, और अगला परिणाम पिछले एक में स्थानांतरित हो जाता है, तो आप परीक्षणों को एक संग्रहित फ़ंक्शन में जोड़ सकते हैं जो कई परीक्षणों से युक्त स्क्रिप्ट को निष्पादित करेगा। इस तरह के एक फ़ंक्शन का एक उदाहरण फ़ाइल परीक्षण / functions_user.sql में है।
फ़ंक्शन को कई पंक्तियों को वापस करने के रूप में घोषित किया जाना चाहिए:
 create or replace function test.test_user_0010() returns setof text as $$ --   - ,        - --        runtests(). -- ,       : declare v_user_id integer; begin --  - ,    ,   : return next lives_ok('select test_user.add_user(''testuser unique''::varchar);', 'test_user.add_user doesnt throw exception'); --   ,   , ,    (>0): v_user_id := test_user.add_user('blah blah'); return next cmp_ok(v_user_id, '>', 0, 'test_user.add_user: returns ok'); --,    . return next results_eq('select user_name::varchar from test_user.users where user_id=' || v_user_id::varchar, 'select ''blah blah''::varchar', 'test_user.add_user inserts ok'); --      : return next is(test_user.alter_user(v_user_id,'new user name blah'), v_user_id, 'test_user.alter_user: returns ok'); --,    : return next results_eq('select user_name::varchar from test_user.users where user_id=' || v_user_id::varchar, 'select ''new user name blah''::varchar', 'test_user.alter_user updates record'); --      id: return next is(test_user.delete_user(v_user_id), v_user_id, 'test_user.delete_user: returns ok'); -- . ,    : return next is_empty('select 1 from test_user.users where user_id=' || v_user_id::varchar, 'test_user.delete_user: deletes ok'); end; $$ language plpgsql; 


आप परीक्षण को सीधे sql से चला सकते हैं:
 psql -h $db_host -p $db_port -U $db_user $db_name -f tests/run_user.sql 

इस स्थिति में, हमें आउटपुट पर एक शुद्ध TAP मिलता है:
 योजना | १.१०
 test_user_0010 | ok 1 - test_user.add_user does not थ्रो अपवाद
 test_user_0010 | ok 2 - test_user.add_user: रिटर्न ओके
 test_user_0010 | ok 3 - test_user.add_user आवेषण रिकॉर्ड
 test_user_0010 | ok 4 - test_user.alter_user: ठीक है
 test_user_0010 | ok 5 - test_user.alter_user अपडेट रिकॉर्ड
 test_user_0010 | ok 6 - test_user.delete_user: ठीक है
 test_user_0010 | ok 7 - test_user.delete_user: ok हटाता है
 tables_are | ok 8 - स्कीमा test_user में उपयोगकर्ता तालिका है
 column_are | ok 9 - test_user.users कॉलम की जाँच करें
 test_scheme_check_func | ok 10 - स्कीमा test_user में सभी कार्य परीक्षणों से आच्छादित हैं।

या pg_prove उपयोगिता का उपयोग कर:
 pg_prove -h $db_host -p $db_port -d $db_name -U $db_user tests/run_*.sql 

तब उत्पादन अधिक मानव-पठनीय होगा:
 परीक्षण / run_user.sql .. ठीक है     
 सभी परीक्षण सफल।
 फ़ाइलें = 1, टेस्ट = 10, 0 वाललॉक सेकंड (0.04 usr + 0.00 sys = 0.04 सीपीयू)
 परिणाम: पास

होस्ट, पोर्ट, उपयोगकर्ता नाम और डेटाबेस के लिए pg_skeleton में स्क्रिप्ट /test/run_tests.sh द्वारा आपके लिए प्रतिस्थापित किया जाएगा।

मुझे उम्मीद है कि अब PostgreSQL संग्रहीत कार्यों में कोड रखने वाले सभी लोगों के पास यूनिट परीक्षण होंगे!

Source: https://habr.com/ru/post/In209932/


All Articles