ბირთვის ტესტირების სტრატეგია
1) პრინციპები
პირამიდული-დატყვევებული ბალანსი. ბაზა - სწრაფი მოდულარული და საკონტრაქტო ტესტები; ზემოთ - კომპონენტი და ინტეგრაცია; თავზე - მინიმალური, მაგრამ ღირებული ფენა e2e.
Shift-left. რაც უფრო ადრე ვიღებთ დეფექტს (ლინტერი, სტატიკური ანალიზი, პროპერტირება), მით უფრო იაფია.
Deterministic by design. ჩვენ ვმართავთ დროს, ქსელს, რანდომს და გარე დამოკიდებულებას.
ხარისხის ეკონომიკა. ნებისმიერი ტესტი არის „დაზღვევა“: მიზანია შეამციროს მთლიანი ხარჯები (დეფექტები + ტესტების თანმხლები).
რისკზე ორიენტაცია. საფარი კონცენტრირებულია ბიზნეს ინვარიანტებსა და ოქმებზე (კონტრაქტები, იდემპოტენტობა, თანმიმდევრულობა).
2) ტესტირების დონე და პასუხისმგებლობის სფეროები
2. 1 ერთეული (მოდულარული)
ისინი ამოწმებენ სუფთა ლოგიკას I/O- ს გარეშე.
ჩვენ მხოლოდ საზღვრებს ვიყენებთ (პორტი/ადაპტერი), ვიყენებთ ქარხნებს მონაცემებისთვის.
სწრაფი (50-100 ms/ტესტი) პარალელურად.
2. 2 Contract (მიმწოდებელი - მომხმარებელი)
ჩაწერეთ API კონტრაქტები (HTTP/gRPC/Event) სერვისებს შორის.
ჩვენ ვიყენებთ consumer-driven მიდგომას: კონტრაქტები ინახება VCS- ში, შემოწმებულია მიმწოდებლის CI- ში.
შეამცირეთ ინტეგრაციის e2e სისქე.
2. 3 კომპონენტი (მოდული, რეალური საცავით)
ჩვენ ვიწყებთ სერვისის ნაწილს ნამდვილი BD/ქეშით კონტეინერში (Testcontainers).
ჩვენ ვხარჯავთ სქემების, ინდექსების, გარიგებების, ბლოკირების მიგრაციას.
2. 4 ინტეგრაცია/სისტემა (მომსახურების გავლა)
ჩვენ ვაყენებთ სერვისების ერთობლიობას იზოლირებულ გარემოში.
ჩვენ ვამოწმებთ ინვარიანტებს: გარიგება, ჭიდაობა, იდემპოტენტობა, შეცდომების დამუშავება.
2. 5 E2E (მინიმალური „ღირებული“ ფენა)
რეალური ოქმები და გარემო „როგორც გაყიდვაში“, მაგრამ შეზღუდული სცენარის ნაკრები: გადახდა - დადასტურება გაყვანილობა; რეგისტრაცია - გადამოწმება - შეყვანა.
ჩვენ ვიყენებთ მაღალი რისკის ფიგურების გამოშვებას და რეგრესიას.
3) საცდელი არქიტექტურა
პორტები/გადამყვანები (Hexagonal). ბიზნეს ბირთვი არ იცის HTTP/SQL- ის შესახებ; დამოკიდებულებები ხორციელდება ინტერფეისების საშუალებით.
დროის/რანდომის ინექცია. 'Clock', 'Random' - დამოკიდებულება; ტესტებში აღვნიშნავთ.
კონფიგურირებული I/O აბსტრაქცია. რიგები, DD, KMS - ინტერფეისების საშუალებით ტესტის განხორციელებით.
ფუნქციური ინვარიანტები. ჩვენ აშკარად ვქმნით პოსტებს და პრედიკატებს - მათი ტესტირება და მონიტორინგი უფრო ადვილია.
4) მონაცემები ტესტებისთვის
ქარხნები/ბილდერები სტატიკური JSON ფიქსატორების ნაცვლად: ნაკლები მყიფეობა.
Idempotent siles და reset huk BD ტესტის წინ (migrations - truncate - seed).
შემთხვევების კატალოგები: „ნორმები“, „კიდეები“, „შეცდომები“, „ქაოსი“.
სინთეზური რეალური ძრავის ნაცვლად: გენერატორები, შენიღბვა, კონფიდენციალურობის პროფილები.
5) კონკურენცია და იდემპოტენტობა
ტესტები რბოლაზე: კონკურენტული ჩანაწერები/რეზერვები/დაბლოკვა.
Idempotent გასაღებების შემოწმება (მაგალითად, '(ოპერაცია, external _ id)'): განმეორებითი ზარები არ ცვლის მდგომარეობას.
Retrai და Taimauts: ჩვენ გარანტიას ვაძლევთ სისწორეს დროებითი შეცდომების შემთხვევაში.
dedupe_key = hash(op + external_id)
if exists(executions, dedupe_key): return previous_result else:
reserve(dedupe_key)
result = do_operation()
store(executions, dedupe_key, result)
return result
6) დრო, ტაიმაუტები, დროის ზონები
ყველა შენახული დროა UTC; ტესტებში ვიყენებთ 'FixedClock'.
ჩვენ ვამოწმებთ DST შემთხვევებს (დუბლები/საათის გამოტოვება), „ადგილობრივი დღის“ ფანჯრები.
Taymauts შეამოწმეთ მონოტონური საათი; NTP ტრეფიკის სიმულაცია.
7) სტაბილურობა და ქაოსი
Fault-injection: ქსელის შეცდომები, 5xx, შეფერხებები, ნაწილობრივი დეგრადაცია (ქეში მიუწვდომელია).
Chaos ტესტები pre-pert- ს შორის: კვანძების გამორთვა, ხაზების გადატვირთვა, BGP/Anycast- ის რღვევები (ემულაცია).
Fallback პოლიტიკა და UX დეგრადაცია: ტესტებმა უნდა დაადასტუროს სწორი „graceful degradation“.
8) პროდუქტიულობა
მიკრო ბენეფიციარები კრიტიკული ალგორითმებისთვის (CPU/alloc ფიქსაციით).
დატვირთვის პროფილები: baseline (p50/p95), სტრესი (მწვერვალი), გახანგრძლივებული (soak) მეხსიერების გაჟონვისთვის.
რეგრესული კარიბჭეები: build ვერ ხერხდება, თუ p95 ლატენტობა უარესია, ვიდრე baseline> X%.
9) უსაფრთხოება და შესაბამისობა
SAST/Lint: დაუცველების/ანტიპათიების ძებნა.
DAST/IAST: საბაზო სკრიპტები სტენდზე (XSS/SQLi/SSRF ტესტები).
Secrets scan: კოდისა და არტეფაქტების გასაღებების/პაროლების არარსებობა.
პირადი ტესტები: საგზაო მოძრაობის წესების არარსებობა ლოგოებში/ტრეკებში, „თანხმობის კონტროლის“ დაცვა, ანონიმიზაციის პროფილები გადმოტვირთვისთვის.
10) ხარისხის მეტრიკა და SLO
Test pass rate და flaky index (არასტაბილური ტესტების/კვირის განმავლობაში).
სამიზნე:- 90-100% კრიტიკული ბირთვის მოდულისთვის,
- პერიფერიისთვის 70-80% (ინვარიანტებზე ფოკუსირება).
- Release risk score: ნაკრები: ცვლილებები კრიტიკულ ფაილებში × renchmarks- ის ვარდნა × ახალი flaky.
- არასწორი ბიუჯეტი: prod-SLO კავშირი (აფთიაქი/შეცდომები) ექსპერიმენტებით და გამოშვების სიხშირით.
11) CI/CD და კარიბჭეები
ეტაპის მატრიცა:1. Lint/Format/TypeCheck
2. Unit + Property-based
3. Contract provider/consumer
4. Component (Testcontainers)
5. Integration + Perf smoke
6. Security (SAST/Secrets)
7. Build/Package + SBOM
8. Deploy to pre-prod + e2e + chaos smoke
კარიბჭეები: გაჩერება ხელშეკრულებების ვარდნის, ლატარიის ზრდის, ახალი კრიტიკული დაუცველების შესახებ.
კეში და შარდინგი: ჩვენ აჩქარებს მილს პარალელიზმისა და არაპირდაპირი პროგონების გამო (შეცვლილი მოდულების მიხედვით).
12) Flaky ტესტები: აღმოჩენა და მკურნალობა
ავტოპროტორი + კვორუმი (2/3 პროგონი).
ფლაკონის შაბლონების დეტექტორი: დამოკიდებულება დროულ/რანდომზე/აშკარა მოლოდინებზე.
კარანტინი SLA- სთან: ტესტი არ ბლოკავს გამოშვებებს, მაგრამ უნდა გამოსწორდეს/გადაწერილი N- ში.
ფლაკის ნულოვანი ტოლერანტობა კრიტიკული ბილიკის „ბირთვში“.
13) Property-based, მუტაცია და ფაზის ტესტირება
Property-based: ფორმულირება თვისებები (კომუტატურობა, იდემპოტენტობა, ერთფეროვნება), სასაზღვრო მონაცემების გენერატორები.
Mutation testing: ჩვენ ვზომავთ ტესტების „ძალას“ (ისინი კლავს მუტაციას).
Fuzzing: ოქმები/პარსერები/ფორმატები (JSON, Protobuf, CSV), განსაკუთრებით უსაფრთხოების საზღვრებში.
prop "serialize/deserialize roundtrip":
forAll(randomModel()):
decode(encode(model)) == model
14) დაკვირვება და ტესტებთან კავშირი
ტესტის კვალი (trace-id ლოგოებში): მოსახერხებელია pre-marsh- ში დაჭერა.
Snapshots metrix სპექტაკლის პერსპექტივაში - დაცულია როგორც არტეფაქტი.
ლოგოების კონტროლი: მგრძნობიარე ველების არარსებობა, ლოგოების ზომა SLO- ში.
15) დოკუმენტაცია და პროცედურები
Test Handbook: სად უნდა დაიწყოს რომელი ტესტები, როგორ დავწეროთ ქარხნები, როგორ განვახორციელოთ კონტრაქტები.
Runbooks: ინციდენტის რეპლიკა, სწრაფი დიაგნოზი, გათავისუფლების დაბრუნება.
ინვარიანტების კატალოგი: სისტემური გარანტიების სია და შესაბამისი ტესტების/ალერტების ბმულები.
16) არქიტექტორის ჩეკის სია
1. აღწერილია ბირთვის ინვარიანტები და კრიტიკული გზები?
2. არსებობს ტესტის დონის მატრიცა და მათი SLO (დრო, სტაბილურობა)?
3. კონტრაქტების ვერსია და ვალუტა ხდება CI- ში მიმწოდებლისა და მომხმარებლისთვის?
4. დრო/ადგილი/ქსელი კონტროლდება ტესტებში (FixedClock, Fault-injector)?
5. შემოწმებულია თუ არა Testcontainers/იზოლირებული DAC, მიგრაცია?
6. არსებობს სპექტაკლები ბაზლაინები და კარიბჭე რეგრესიისთვის?
7. შედის SAST/Secrets-scan და კერძო ლოგოების შემოწმება?
8. დაფრინავს და არის თუ არა SLA გამოსწორება?
9. ტესტის კავშირი პროდ-SLO- სთან და მცდარი ბიუჯეტით არის გამჭვირვალე?
10. დოკუმენტირებულია runbook 'და ინვარიანტების კატალოგი?
დასკვნა
ბირთვის ტესტირების სტრატეგია არ არის ინსტრუმენტების სია, არამედ არქიტექტურული უნარი: საცდელი დიზაინი, დონის მკაცრი იერარქია, კონტროლირებადი მონაცემები, უკმარისობა და CI/CD- ში ჩაშენებული მეტრიკა. აღწერილი პრაქტიკის შემდეგ, გუნდი იღებს სწრაფ და საიმედო გამოხმაურებას, ხოლო გამოშვებები პროგნოზირებადი და უსაფრთხო ხდება.