# QA 5: Test dizayn texnikalari (1) — Equivalence Partitioning, Boundary Value Analysis va Decision Table

> **Holat:** 2026-yil oktabr. Dars ISTQB CTFL v4.0.1 syllabus'ining 4.2-bo'limi (black-box texnikalar) va ISTQB'ning rasmiy "Boundary Value Analysis" white paper'i asosida yozilgan. Barcha misollar xayoliy DemoBozor do'konining qoidalariga tayanadi.

> **Bu darsdan keyin siz:** cheksiz ko'p kiritish variantlaridan kichik, lekin kuchli test to'plamini tizimli ravishda chiqara olasiz.

- har qanday maydon uchun valid va invalid equivalence partition'larni ajratasiz;
- 2-value va 3-value BVA bilan chegara qiymatlarini aniq hisoblaysiz (ko'pchilik adashadigan joyni ham bilasiz);
- murakkab biznes qoidani decision table'ga aylantirib, talablardagi bo'shliqlarni topasiz;
- texnikalarni birlashtirib, checkout formasi uchun to'liq test to'plami tuzasiz.

## Mundarija

1. [Nega texnika kerak: "hammasini tekshiraman" degan xayol](#nega-texnika)
2. [Test dizayn texnikalari xaritasi](#texnikalar-xaritasi)
3. [Equivalence Partitioning (EP)](#ep)
4. [Boundary Value Analysis (BVA)](#bva)
5. [Raqam bo'lmagan tuzoqlar: format, probel va so'm](#tuzoqlar)
6. [Decision Table testing](#decision-table)
7. [Texnikalarni birlashtirish: checkout formasi](#birlashtirish)
8. [Ko'p uchraydigan xatolar](#xatolar)
9. [Amaliy mashqlar](#mashqlar)
10. [Xulosa](#xulosa)
11. [Manbalar](#manbalar)

---

## 1. Nega texnika kerak: "hammasini tekshiraman" degan xayol {#nega-texnika}

DemoBozor'ning muddatli to'lov (foizsiz bo'lib to'lash) arizasida "Yosh" maydoni bor. Talab oddiy: **18 yoshdan 65 yoshgacha (shu jumladan)**. Agar maydon 0 dan 150 gacha butun son qabul qilsa — bu 151 ta qiymat. Yana "Summa" (500 000 – 30 000 000 so'm) va "Muddat" (3, 6 yoki 12 oy) maydonlari bor. Hammasini birga tekshirsak, kombinatsiyalar soni milliardlarga yetadi.

ISTQB'ning 2-printsipi buni rasman aytadi: **barcha variantni tekshirish (exhaustive testing) mumkin emas** (batafsil — [QA 2](/ios-lessons/qa-principles-istqb)). Demak savol "hammasini qanday tekshiraman?" emas, balki **"qaysi kichik to'plam qolgan hammasini ishonchli ifodalaydi?"**.

Test dizayn texnikalari aynan shu savolga javob beradi. ISTQB syllabus'i ularni shunday ta'riflaydi: texnikalar _nisbatan kichik, lekin yetarli_ test case to'plamini **tizimli** ravishda ishlab chiqishga yordam beradi.

Hayotiy analogiya: laboratoriya butun qonni emas, bitta probirkani tekshiradi. Chunki probirkadagi qon butun organizmdagi qonni _ifodalaydi_. Equivalence partitioning ham xuddi shunday ishlaydi: bitta qiymat butun guruhni ifodalaydi.

Har bir texnika uchta narsani beradi:

| Tushuncha             | Ma'nosi                                    | Misol (yosh maydoni)              |
| --------------------- | ------------------------------------------ | --------------------------------- |
| **Test condition**    | Nimani tekshiramiz                         | "Yosh chegarasi to'g'ri ishlaydi" |
| **Coverage item**     | Texnika aytgan "tekshirish nuqtasi"        | 17, 18, 65, 66 qiymatlari         |
| **Coverage (qamrov)** | Bajarilgan item'lar / jami item'lar × 100% | 4 tadan 4 tasi → 100%             |

> **🧠 Esda tuting:** Texnika — bu ijodni o'ldiradigan qolip emas. U sizga "qayerga qarash kerak"ligini aytadi, qolganini tajriba va savollar to'ldiradi.

> **🎯 Intervyuda:** "Nega hamma kiritishlarni tekshirib bo'lmaydi?" — Kombinatsiyalar soni amalda cheksiz; shuning uchun EP, BVA va decision table kabi texnikalar bilan risk va qamrovga asoslangan kichik, lekin samarali to'plam tanlaymiz.

---

## 2. Test dizayn texnikalari xaritasi {#texnikalar-xaritasi}

ISTQB CTFL v4.0 texnikalarni to'rt guruhga ajratadi:

| Guruh                               | Texnikalar                                                                          | Nimaga tayanadi                                | Kursda                                                                         |
| ----------------------------------- | ----------------------------------------------------------------------------------- | ---------------------------------------------- | ------------------------------------------------------------------------------ |
| **Black-box** (specification-based) | Equivalence Partitioning, Boundary Value Analysis, Decision Table, State Transition | Talab, spetsifikatsiya — ichki kodni bilmasdan | QA 5, [QA 6](/ios-lessons/qa-test-design-2)                                    |
| **White-box** (structure-based)     | Statement testing, Branch testing                                                   | Kodning ichki tuzilishi                        | [QA 6](/ios-lessons/qa-test-design-2)                                          |
| **Experience-based**                | Error guessing, Exploratory testing, Checklist-based testing                        | Tester tajribasi va bilimi                     | [QA 6](/ios-lessons/qa-test-design-2)                                          |
| **Collaboration-based**             | Collaborative user story writing, Acceptance criteria, ATDD                         | Jamoaviy muloqot — defektning oldini olish     | [QA 3](/ios-lessons/qa-sdlc-stlc-agile), [QA 6](/ios-lessons/qa-test-design-2) |

Black-box texnikalarning katta afzalligi: test case'lar kod qanday yozilganiga bog'liq emas. Dasturchi kodni qayta yozsa ham, talab o'zgarmagan bo'lsa, testlaringiz hamon foydali.

Bu darsda black-box guruhining uchta texnikasini o'rganamiz. To'rtinchisi — state transition — keyingi darsda.

---

## 3. Equivalence Partitioning (EP) {#ep}

### 3.1. G'oya

**Equivalence Partitioning** ma'lumotlarni **partition**'larga (ekvivalent guruhlarga) bo'ladi. Bitta partition ichidagi barcha qiymatlarni tizim **bir xil** qayta ishlaydi deb kutiladi. Shuning uchun, agar bitta qiymat defektni topsa, shu partition'dagi boshqa qiymat ham uni topadi. Natija: **har partition'dan bitta test yetarli**.

Syllabus qo'yadigan qoidalar:

- partition'lar **kesishmaydi** va **bo'sh emas**;
- partition kiritishlar uchungina emas: **chiqishlar** (output), konfiguratsiya, ichki qiymatlar, vaqtga bog'liq qiymatlar va interfeys parametrlari uchun ham tuziladi;
- **valid partition** — tizim qabul qilib qayta ishlashi kerak bo'lgan qiymatlar; **invalid partition** — rad etilishi yoki e'tiborsiz qoldirilishi kerak bo'lganlar.

**Qamrov formulasi:** EP coverage = (kamida bitta test tekkan partition'lar) / (aniqlangan barcha partition'lar) × 100%. Invalid partition'lar ham hisobga kiradi.

### 3.2. Misol 1: muddatli to'lov — yosh 18–65

Avval biznes qoidasi bo'yicha bo'lamiz:

| Partition | Qiymatlar         | Turi    | Vakil qiymat | Kutilgan natija                       |
| --------- | ----------------- | ------- | ------------ | ------------------------------------- |
| P1        | 0–17              | invalid | 10           | "Muddatli to'lov 18 yoshdan" xabari   |
| P2        | 18–65             | valid   | 40           | Ariza davom etadi                     |
| P3        | 66 va undan katta | invalid | 80           | "Muddatli to'lov 65 yoshgacha" xabari |

Keyin **format** bo'yicha alohida partition'lar — bu boshqa test condition:

| Partition  | Vakil qiymat | Kutilgan natija                                                            |
| ---------- | ------------ | -------------------------------------------------------------------------- |
| Bo'sh      | `""`         | "Yoshni kiriting"                                                          |
| Raqam emas | `yigirma`    | "Faqat raqam kiriting"                                                     |
| Manfiy     | `-5`         | Rad etiladi                                                                |
| Kasr       | `25.5`       | Rad etiladi yoki butun songa keltiriladi — **talabda yo'q, so'rash kerak** |

> **💡 Maslahat:** Biznes qoidasini (18–65) va formatni (raqammi?) bitta jadvalga aralashtirmang. Ular odatda kodning turli qatlamlarida (UI validatsiya va server mantiqi) yashaydi va turli bug'lar beradi.

### 3.3. Misol 2: parol — 8–64 belgi, kamida 1 harf va 1 raqam

Sotuvchi web panelining paroli uchun **ikkita partition to'plami** bor:

| To'plam | Partition    | Turi    | Vakil                        |
| ------- | ------------ | ------- | ---------------------------- |
| Uzunlik | 0–7          | invalid | `Ab1` (3 belgi)              |
| Uzunlik | 8–64         | valid   | `Bozor2026` (9 belgi)        |
| Uzunlik | 65+          | invalid | 65 belgili harf+raqam qatori |
| Tarkib  | harf + raqam | valid   | `Bozor2026`                  |
| Tarkib  | faqat harf   | invalid | `faqatharflar`               |
| Tarkib  | faqat raqam  | invalid | `1234567890`                 |

Bir nechta to'plam bo'lganda eng oddiy qamrov mezoni — **Each Choice coverage**: har to'plamdagi har partition kamida bir marta tekshiriladi (kombinatsiyalar hisobga olinmaydi).

| TC    | Kiritish              | Uzunlik | Tarkib         | Kutilgan               |
| ----- | --------------------- | ------- | -------------- | ---------------------- |
| TC-P1 | `Bozor2026`           | 8–64 ✅ | harf+raqam ✅  | Parol qabul qilinadi   |
| TC-P2 | `Ab1`                 | 0–7 ❌  | harf+raqam ✅  | "Kamida 8 belgi"       |
| TC-P3 | 65 belgi (harf+raqam) | 65+ ❌  | harf+raqam ✅  | "Ko'pi bilan 64 belgi" |
| TC-P4 | `faqatharflar`        | 8–64 ✅ | faqat harf ❌  | "Kamida 1 raqam"       |
| TC-P5 | `1234567890`          | 8–64 ✅ | faqat raqam ❌ | "Kamida 1 harf"        |

Beshta test 6 ta partition'ning hammasini qamradi. E'tibor bering: **har testda ko'pi bilan bitta invalid partition**. Agar `Ab` (qisqa _va_ raqamsiz) kiritsak, tizim birinchi xatoni ko'rsatib to'xtashi mumkin — ikkinchi tekshiruv umuman ishlamay qoladi va undagi bug yashirinadi. Buni **defect masking** deyiladi.

EP talabdagi bo'shliqlarni ham ochadi. Savollar:

- Kirill harflari "harf" hisoblanadimi (`Бозор2026`)?
- Maxsus belgilar (`!`, `_`) va probelga ruxsat bormi?
- 64 belgi — baytmi yoki belgi? (Emoji bir nechta bayt egallaydi.)

### 3.4. Misol 3: savatchadagi miqdor — 1–99

| Partition  | Vakil  | Kutilgan             |
| ---------- | ------ | -------------------- |
| ≤ 0        | `0`    | Rad etiladi          |
| 1–99       | `5`    | Savatcha yangilanadi |
| ≥ 100      | `150`  | Rad etiladi          |
| Butun emas | `1.5`  | Rad etiladi          |
| Raqam emas | `ikki` | Rad etiladi          |

Mobil ilovada miqdor ko'pincha `−` / `+` tugmalari bilan o'zgaradi va 100 ni UI orqali kiritib bo'lmaydi. Lekin API'ga (`PATCH /api/v1/cart/items/{id}`, xayoliy endpoint) `{"quantity": 100}` yuborish mumkin. **Invalid partition'ni UI yopgan bo'lsa ham, uni API darajasida tekshiring** (batafsil — [QA 11](/ios-lessons/qa-api-advanced)).

### 3.5. Misol 4: telefon raqam — `+998` va 9 raqam

| Partition          | Vakil               | Turi         |
| ------------------ | ------------------- | ------------ |
| To'g'ri format     | `+998901234567`     | valid        |
| Boshqa davlat kodi | `+77011234567`      | invalid      |
| 8 ta raqam         | `+99890123456`      | invalid      |
| 10 ta raqam        | `+9989012345678`    | invalid      |
| Harf bor           | `+99890123456a`     | invalid      |
| Bo'sh              | `""`                | invalid      |
| Probel bilan       | `+998 90 123 45 67` | **noma'lum** |
| Plyussiz           | `998901234567`      | **noma'lum** |
| Mahalliy           | `901234567`         | **noma'lum** |

Oxirgi uch qator — EP'ning eng qimmatli natijasi: talab ularni aytmaydi. Foydalanuvchi raqamni kontaktlardan probel bilan nusxalaydi — bu real holat. Savol: "Formatlangan raqamni qabul qilib, normallashtiramizmi yoki rad etamizmi?" Javob olinmaguncha test case'ni yozmang.

### 3.6. Chiqish (output) partition'lari

EP faqat kiritishlar uchun emas. Yetkazib berish narxi ikki xil **natija** beradi: `0` (bepul) yoki `20 000` so'm. Har bir natija — partition. Demak kamida ikkita test kerak: biri bepul yetkazishga olib keladigan (masalan, 350 000 so'mlik savatcha), biri pullik yetkazishga olib keladigan (masalan, 120 000 so'mlik savatcha).

> **🎯 Intervyuda:** "EP'da nechta test case kerak?" — Har bir partition (invalid'lar ham) uchun kamida bittadan. Bir nechta parametr bo'lsa — Each Choice coverage, va invalid partition'lar defect masking bo'lmasligi uchun alohida testlarda tekshiriladi.

---

## 4. Boundary Value Analysis (BVA) {#bva}

### 4.1. Nega aynan chegaralar?

Dasturchilar eng ko'p chegarada adashadi: `>` o'rniga `>=`, `<` o'rniga `<=`, sikl bir marta ko'p yoki kam aylanadi (off-by-one). Talab "18 yoshdan 65 yoshgacha (shu jumladan)" — lekin kodda shunday yozilgan bo'lishi mumkin:

```javascript
// Talab: 18–65 yosh, ikkala chegara ham kiradi
if (age > 18 && age <= 65) {
  allowInstallment(); // BUG: 18 yoshli foydalanuvchi rad etiladi
}
```

40 yoshli foydalanuvchi bilan test o'tadi. Faqat 18 qiymati bug'ni ko'rsatadi. BVA aynan shuning uchun bor.

BVA faqat **tartiblangan** (ordered) partition'larda ishlaydi: sonlar, uzunliklar, sanalar, summalar. To'lov usuli (Uzcard, Humo, Visa...) yoki muddat to'plami `{3, 6, 12}` uchun BVA ma'nosiz — ular uchun faqat EP.

### 4.2. Chegara qiymati — partition'ning min va max'i

ISTQB white paper'i muhim farqni ta'kidlaydi: **chegara qiymati (boundary value) ikki partition orasidagi "chiziq" emas**, balki partition'ning o'z eng kichik va eng katta elementi.

Yosh misolida domen — 0 dan boshlanadigan butun sonlar:

| Partition               | Qiymatlar   | Chegara qiymatlari             |
| ----------------------- | ----------- | ------------------------------ |
| Q (juda yosh, invalid)  | 0–17        | **0** va **17**                |
| P (valid)               | 18–65       | **18** va **65**               |
| R (juda katta, invalid) | 66, 67, ... | **66** (yuqori chegarasi yo'q) |

![Yosh 18–65: equivalence partition'lar, 2-value va 3-value BVA nuqtalari](/lessons/images/qa/qa_05_ep_bva.svg)

### 4.3. 2-value BVA

Har bir chegara qiymati uchun **ikkita** coverage item: chegaraning o'zi va qo'shni partition'dagi eng yaqin qo'shnisi. Amalda bu barcha chegara qiymatlari to'plamiga teng:

**2-value: {0, 17, 18, 65, 66}**

| TC    | Yosh | Partition | Kutilgan       |
| ----- | ---- | --------- | -------------- |
| TC-B1 | 0    | Q (min)   | Rad etiladi    |
| TC-B2 | 17   | Q (max)   | Rad etiladi    |
| TC-B3 | 18   | P (min)   | Qabul qilinadi |
| TC-B4 | 65   | P (max)   | Qabul qilinadi |
| TC-B5 | 66   | R (min)   | Rad etiladi    |

### 4.4. 3-value BVA

Har bir chegara qiymati uchun **uchta** coverage item: chegaraning o'zi va **ikkala** qo'shnisi — qaysi partition'ga tegishli bo'lishidan qat'i nazar:

| Chegara | 3-value item'lari      |
| ------- | ---------------------- |
| 0       | 0, 1 (−1 domenda yo'q) |
| 17      | 16, 17, 18             |
| 18      | 17, 18, 19             |
| 65      | 64, 65, 66             |
| 66      | 65, 66, 67             |

Birlashmasi: **3-value: {0, 1, 16, 17, 18, 19, 64, 65, 66, 67}** — 2-value'ga qo'shimcha 1, 16, 19, 64, 67.

> **⚠️ Diqqat:** Ko'p maqola va kurslarda "3-value BVA = 17, 18, 19, 64, 65, 66" deb yoziladi. Bu faqat valid partition chegaralarini (18 va 65) olganda chiqadi. ISTQB white paper'iga ko'ra 17 va 66 ham chegara qiymati — ular invalid partition'lar chegarasi. Shuning uchun ikki partition orasidagi har bir ichki chegarada 3-value BVA **to'rtta** nuqta beradi (16, 17, 18, 19). Intervyuda ikkala talqinni bilib, rasmiysini tushuntira olsangiz — katta plyus.

### 4.5. 3-value nimasi bilan kuchliroq?

Syllabus'dagi misolni DemoBozor'ga ko'chiramiz. Talab: mahsulotlar summasi **≥ 300 000** so'm bo'lsa, yetkazish bepul. Dasturchi xato yozdi:

```javascript
function deliveryFee(subtotal) {
  // To'g'risi: subtotal >= 300000
  return subtotal === 300000 ? 0 : 20000; // BUG: faqat aynan 300 000 da bepul
}
```

| BVA turi | Qiymatlar                                       | Natija (bug'li kod) | Bug topildimi? |
| -------- | ----------------------------------------------- | ------------------- | -------------- |
| 2-value  | 299 999 → 20 000 ✅, 300 000 → 0 ✅             | Ikkalasi ham o'tadi | ❌ Yo'q        |
| 3-value  | qo'shimcha 300 001 → kutilgan 0, haqiqiy 20 000 | Test yiqiladi       | ✅ Ha          |

2-value to'plami bug'ni ko'rmadi, 3-value'dagi 300 001 ko'rdi. Shuning uchun xavfli joylarda (pul, limit, xavfsizlik) 3-value BVA'ni tanlang.

### 4.6. DemoBozor'ning boshqa chegaralari

| Maydon / qoida               | Partition'lar       | 2-value               | 3-value                                    |
| ---------------------------- | ------------------- | --------------------- | ------------------------------------------ |
| Parol uzunligi 8–64          | 0–7, 8–64, 65+      | 0, 7, 8, 64, 65       | 0, 1, 6, 7, 8, 9, 63, 64, 65, 66           |
| Miqdor 1–99 (API, butun son) | ≤0, 1–99, ≥100      | 0, 1, 99, 100         | −1, 0, 1, 2, 98, 99, 100, 101              |
| Bepul yetkazish ≥ 300 000    | 0–299 999, 300 000+ | (0), 299 999, 300 000 | (0, 1), 299 998, 299 999, 300 000, 300 001 |
| Qidiruv 2–100 belgi          | 0–1, 2–100, 101+    | 0, 1, 2, 100, 101     | 0, 1, 2, 3, 99, 100, 101, 102              |
| Sharh matni 10–1000 belgi    | 0–9, 10–1000, 1001+ | 0, 9, 10, 1000, 1001  | 0, 1, 8, 9, 10, 11, 999, 1000, 1001, 1002  |
| Yulduz 1–5                   | ≤0, 1–5, ≥6         | 0, 1, 5, 6            | −1, 0, 1, 2, 4, 5, 6, 7                    |

Qavs ichidagilar — **domen chegaralari**. Masalan, bo'sh savatcha bilan checkout qilib bo'lmaydi, shuning uchun 0 so'mlik summa amalda erishib bo'lmaydigan (infeasible) coverage item. White paper'da ham shunday: login uzunligi uchun −1 qiymati umuman yo'q.

> **💡 Maslahat:** Uzunlik chegaralarida UI ko'pincha `maxlength` bilan yuqori chegarani "yopib" qo'yadi — 65-belgini yozib bo'lmaydi. Lekin server ham tekshirishi shart. 65 va 66 belgili qiymatlarni API orqali yuboring.

### 4.7. Vaqt va sanadagi chegaralar

BVA vaqtga ham qo'llanadi:

| Qoida                                  | Chegara atrofidagi testlar                        | Talabdan so'raladigan savol                                                                             |
| -------------------------------------- | ------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| SMS kod 120 soniya amal qiladi         | 119 s, 120 s, 121 s                               | Aynan 120-soniyada kod hali amal qiladimi?                                                              |
| Qayta yuborish 60 soniyadan keyin      | 59 s (tugma o'chiq), 60 s (yoqiq)                 | Taymer serverdami yoki ilovada?                                                                         |
| 3 noto'g'ri urinish → 15 daqiqa blok   | 2-xato (blok yo'q), 3-xato (blok); 14:59 va 15:00 | Blok aynan 15:00 da tugaydimi?                                                                          |
| Qaytarish yetkazilgandan 10 kun ichida | 10-kun (ruxsat), 11-kun (rad)                     | Kun qanday sanaladi: kalendar kunimi yoki 240 soatmi? Yarim tunda Asia/Tashkent bo'yicha hisoblanadimi? |

120 soniyani kutib o'tirish shart emas: staging muhitida dasturchilardan TTL'ni sozlanadigan qilishni yoki server vaqtini o'zgartiradigan test hook'ini so'rang. Bu — testlanuvchanlik (testability) talabi.

> **🇺🇿 Mahalliy kontekst:** O'zbekcha "18 yoshdan 65 yoshgacha" iborasi ikki xil o'qiladi: 65 kiradimi yoki yo'qmi? Talablarda doim "(shu jumladan)" yoki "≤ 65" deb aniq yozdiring. Bu kichik so'z ko'plab bahs va bug'lardan saqlaydi.

> **🎯 Intervyuda:** "2-value va 3-value BVA farqi nima?" — 2-value'da har bir chegara qiymati uchun ikkita item (chegara va qo'shni partition'dagi qo'shnisi), 3-value'da uchta (chegara va ikkala qo'shnisi). 3-value qattiqroq: masalan `x <= 10` o'rniga `x == 10` yozilgan bug'ni faqat 3-value'dagi 9 qiymati topadi.

---

## 5. Raqam bo'lmagan tuzoqlar: format, probel va so'm {#tuzoqlar}

EP va BVA "toza" sonlar bilan ishlaydi. Real foydalanuvchi esa matn kiritadi. Har bir sonli maydon uchun bu tuzoqlarni ham tekshiring:

| Tuzoq                   | Misol                                 | Nima buzilishi mumkin                                 |
| ----------------------- | ------------------------------------- | ----------------------------------------------------- |
| Bo'sh yoki faqat probel | `""`, `"   "`                         | Bo'sh qiymat 0 deb qabul qilinadi                     |
| Bosh/oxiridagi probel   | `" 25 "`                              | Validatsiya `trim` qilmaydi                           |
| Kasr ajratgich          | `25.5` va `25,5`                      | Rus/o'zbek lokalida vergul — kasr ajratgich           |
| Boshidagi nol           | `018`, SMS kod `012345`               | Kod son sifatida o'qilsa `12345` bo'lib qoladi        |
| Juda katta son          | `99999999999999999999`                | JavaScript `Number` aniqligi 2^53 dan keyin yo'qoladi |
| Belgili son             | `+18`, `-0`                           | Kutilmagan qabul qilish                               |
| Ming ajratgich          | `1 000 000`, `1,000,000`, `1.000.000` | Narx noto'g'ri o'qiladi                               |
| Bo'linmas probel (NBSP) | Excel'dan nusxalangan `300 000`       | Ko'zga ko'rinmaydi, lekin parse buziladi              |
| Valyuta bilan           | `300 000 so'm`, `300000 UZS`          | Matn qismi sababli xato                               |
| Ortiqcha yangi qator    | nusxalangan `482915⏎`                 | SMS kod "noto'g'ri" bo'ladi                           |

> **⚠️ Diqqat:** SMS kod, karta raqami, pochta indeksi — bu **matn**, son emas. Ular ustida arifmetika qilinmaydi. Agar dasturchi ularni son turida saqlasa, boshidagi nollar yo'qoladi. `012345` kodli test bunday bug'ni darhol ochadi.

DemoBozor'da narxlar butun so'mda saqlanadi (bazada `INTEGER`). Demak summalarda eng yaqin qo'shni ±1 so'm: 300 000 chegarasining qo'shnilari — 299 999 va 300 001.

---

## 6. Decision Table testing {#decision-table}

### 6.1. Qachon kerak?

Talab "agar ... va ... bo'lsa, unda ..." ko'rinishida bo'lsa — decision table vaqti. U shartlar kombinatsiyasini va ularga mos harakatlarni jadvalga yig'adi. Syllabus belgilashlari:

| Belgi | Ma'nosi                                               |
| ----- | ----------------------------------------------------- |
| `T`   | Shart bajarilgan (true)                               |
| `F`   | Shart bajarilmagan (false)                            |
| `–`   | Shart natijaga ta'sir qilmaydi (irrelevant)           |
| `N/A` | Bunday kombinatsiya bo'lishi mumkin emas (infeasible) |
| `X`   | Harakat sodir bo'ladi; bo'sh katak — sodir bo'lmaydi  |

Qoidalar:

- **To'liq jadval** — barcha kombinatsiyalar: n ta ikkilik shart uchun 2ⁿ ustun.
- Imkonsiz kombinatsiyali ustunlar **o'chiriladi**.
- Natijaga ta'sir qilmaydigan shartli ustunlar **birlashtiriladi** (minimallashtirish).
- **Coverage** = tekshirilgan ustunlar / barcha mumkin (feasible) ustunlar × 100%.

### 6.2. DemoBozor chegirmalari: to'liq jadval

DemoBozor qoidalari: yangi mijoz (birinchi buyurtma) — 10%; promo-kod — odatda 15%; chegirmalar qo'shilmaydi, **kattasi** qo'llanadi; Premium a'zo har doim bepul yetkazish oladi.

Bu bo'limda 15% li `BAHOR15` (xayoliy) promo-kodini olamiz.

|                                          | R1  | R2  | R3  | R4  | R5  | R6  | R7  | R8  |
| ---------------------------------------- | --- | --- | --- | --- | --- | --- | --- | --- |
| **C1:** Yangi mijozmi?                   | T   | T   | T   | T   | F   | F   | F   | F   |
| **C2:** Amaldagi 15% promo-kod bormi?    | T   | T   | F   | F   | T   | T   | F   | F   |
| **C3:** Premium a'zomi?                  | T   | F   | T   | F   | T   | F   | T   | F   |
| **A1:** 10% chegirma                     |     |     | X   | X   |     |     |     |     |
| **A2:** 15% chegirma                     | X   | X   |     |     | X   | X   |     |     |
| **A3:** Premium bo'yicha bepul yetkazish | X   |     | X   |     | X   |     | X   |     |

R1 va R2 da yangi mijoz ham, promo-kod ham bor. Chegirmalar qo'shilmaydi (10% + 15% = 25% emas) — kattasi, 15% qo'llanadi.

### 6.3. Minimallashtirilgan jadval

C2 = T bo'lsa, C1 natijaga ta'sir qilmaydi (15% baribir yutadi). Demak R1 bilan R5, R2 bilan R6 birlashadi:

|                                   | M1  | M2  | M3  | M4  | M5  | M6  |
| --------------------------------- | --- | --- | --- | --- | --- | --- |
| **C1:** Yangi mijoz               | –   | –   | T   | T   | F   | F   |
| **C2:** 15% promo                 | T   | T   | F   | F   | F   | F   |
| **C3:** Premium                   | T   | F   | T   | F   | T   | F   |
| **A1:** 10%                       |     |     | X   | X   |     |     |
| **A2:** 15%                       | X   | X   |     |     |     |     |
| **A3:** Bepul yetkazish (premium) | X   |     | X   |     | X   |     |

8 ustun o'rniga 6 ta. 100% coverage uchun 6 ta test kerak.

> **⚠️ Diqqat:** Minimallashtirish faqat "C1 haqiqatan ta'sir qilmaydi" degan farazga asoslanadi. Agar dasturchi kodda avval C1 ni tekshirib, keyin promo'ni umuman ko'rmasa — birlashtirilgan ustun bu bug'ni yashiradi. Pul bilan bog'liq kritik qoidalarda to'liq jadvalni saqlash xavfsizroq.

Agar biznes "yangi mijoz Premium bo'la olmaydi" desa, C1 = T va C3 = T bo'lgan ustunlar `N/A` (infeasible) bo'lib, jadvaldan o'chiriladi. Hozircha DemoBozor qoidalarida bunday cheklov yo'q.

### 6.4. Test case'lar

Hamma testlarda mahsulotlar summasi **250 000 so'm** — 300 000 dan kam, shuning uchun bepul yetkazish faqat Premium tufayli bo'lishi mumkin. Bu chegirma va yetkazish qoidalarini bir-biridan ajratib tekshirish imkonini beradi.

| TC    | Ustun | Mijoz          | Promo     | Kutilgan chegirma | Kutilgan yetkazish | Kutilgan jami |
| ----- | ----- | -------------- | --------- | ----------------- | ------------------ | ------------- |
| TC-D1 | M1    | Eski, Premium  | `BAHOR15` | 37 500 (15%)      | 0                  | 212 500       |
| TC-D2 | M2    | Eski, oddiy    | `BAHOR15` | 37 500 (15%)      | 20 000             | 232 500       |
| TC-D3 | M3    | Yangi, Premium | —         | 25 000 (10%)      | 0                  | 225 000       |
| TC-D4 | M4    | Yangi, oddiy   | —         | 25 000 (10%)      | 20 000             | 245 000       |
| TC-D5 | M5    | Eski, Premium  | —         | 0                 | 0                  | 250 000       |
| TC-D6 | M6    | Eski, oddiy    | —         | 0                 | 20 000             | 270 000       |

M1 da C1 "–". Biz eski mijozni oldik; vaqt bo'lsa, yangi mijoz bilan ham bir marta tekshirib qo'yish (R1) — arzon sug'urta.

### 6.5. Jadval talabdagi bo'shliqlarni ochadi

Syllabus aytganidek, decision table talabdagi bo'shliq va qarama-qarshiliklarni topishga yordam beradi. Jadvalni tuzayotganda PO'ga beriladigan savollar:

1. **300 000 chegarasi chegirmadan oldingi summadami yoki keyingisidami?** 320 000 so'mlik savatcha 15% bilan 272 000 bo'ladi. Yetkazish bepulmi?
2. Promo-kod 5% bo'lsa va mijoz yangi bo'lsa — "kattasi" qoidasi bo'yicha 10% qo'llanadimi? Foydalanuvchiga promo "qabul qilinmadi" deb ko'rsatiladimi?
3. Muddati o'tgan promo kiritilsa, yangi mijozning 10% i saqlanib qoladimi?
4. Chegirma yetkazish narxiga ham qo'llanadimi?

Har bir savol — kelajakdagi bug'ning oldi olingan joyi.

### 6.6. Ikkinchi kichik jadval: yetkazib berish

|                         | Y1  | Y2  | Y3  | Y4  |
| ----------------------- | --- | --- | --- | --- |
| **C1:** Premium a'zo    | T   | T   | F   | F   |
| **C2:** Summa ≥ 300 000 | T   | F   | T   | F   |
| **A1:** Bepul           | X   | X   | X   |     |
| **A2:** 20 000 so'm     |     |     |     | X   |

Minimallashtirilgani: (T, –) → bepul; (F, T) → bepul; (F, F) → 20 000. **3 ta test** yetarli. C2 shartining o'zi esa chegara — uni BVA bilan (299 999 / 300 000) alohida tekshiramiz. Texnikalar shunday birga ishlaydi.

> **🎯 Intervyuda:** "Uchta ikkilik shartli decision table'da nechta ustun bor?" — To'liq jadvalda 2³ = 8 ta. Imkonsiz ustunlar o'chiriladi, natijaga ta'sir qilmaydigan shartlar "–" bilan birlashtiriladi. Coverage — tekshirilgan feasible ustunlar ulushi.

---

## 7. Texnikalarni birlashtirish: checkout formasi {#birlashtirish}

Real ekranda texnikalar alohida yashamaydi. DemoBozor checkout'ida quyidagilar bor:

| Element         | Qoida                                                    | Texnika                                       |
| --------------- | -------------------------------------------------------- | --------------------------------------------- |
| Miqdor          | 1–99                                                     | EP + BVA                                      |
| Promo-kod       | 6–12 belgi, A–Z va 0–9                                   | EP (uzunlik, belgilar, holat) + BVA (uzunlik) |
| To'lov usuli    | Uzcard, Humo, Visa, Mastercard, naqd                     | EP (har usul — alohida partition)             |
| Narx hisobi     | Chegirma va yetkazish qoidalari                          | Decision table                                |
| Muddatli to'lov | Yosh 18–65, summa 500 000 – 30 000 000, muddat 3/6/12 oy | EP + BVA (yosh, summa), EP (muddat)           |

Ish tartibi:

1. Har bir element uchun partition'larni yozing.
2. Tartiblangan partition'larga BVA qo'llang.
3. Qoidalar kombinatsiyasini decision table'ga soling.
4. **Valid** partition'larni Each Choice bilan oz sonli testlarga "joylang".
5. **Invalid** partition'larni bittadan, qolgan maydonlar valid holda tekshiring.
6. Risk bo'yicha tartiblang: pul va to'lov — birinchi.

Natijadagi namuna to'plam:

| TC     | Ma'lumot                                           | Texnika             | Kutilgan                         |
| ------ | -------------------------------------------------- | ------------------- | -------------------------------- |
| TC-C01 | Miqdor 2, promo yo'q, Uzcard                       | Baza (valid)        | Buyurtma `CREATED`               |
| TC-C02 | Miqdor 99, Humo                                    | BVA (max)           | Qabul qilinadi                   |
| TC-C03 | Miqdor 100 (API orqali)                            | BVA (max+1)         | 400/422, savatcha o'zgarmaydi    |
| TC-C04 | Promo `BAHOR` (5 belgi)                            | BVA (min−1)         | "Promo-kod 6–12 belgi"           |
| TC-C05 | Promo `ABCDEF123456` (12 belgi, xayoliy, amaldagi) | BVA (max)           | Qabul qilinadi                   |
| TC-C06 | Promo `bahor15` (kichik harf)                      | EP (belgilar)       | **Talabda yo'q** — so'rash kerak |
| TC-C07 | Visa, Mastercard, naqd                             | EP (har usul)       | Har biri alohida o'tadi          |
| TC-C08 | Muddatli: yosh 18, summa 500 000, 3 oy             | BVA (min'lar)       | Ariza qabul qilinadi             |
| TC-C09 | Muddatli: summa 499 999                            | BVA (min−1)         | Rad etiladi                      |
| TC-C10 | Muddatli: yosh 66                                  | BVA (max+1)         | Rad etiladi                      |
| TC-C11 | Muddatli: 9 oy                                     | EP (invalid qiymat) | Rad etiladi                      |

E'tibor bering: muddat `{3, 6, 12}` uchun BVA qilmadik. Bu to'plam uzluksiz emas (4 va 5 kirmaydi), shuning uchun "chegara" tushunchasi bu yerda ishlamaydi. 3, 6, 12 — har biri alohida valid qiymat, 9 esa invalid.

---

## 8. Ko'p uchraydigan xatolar {#xatolar}

| Xato                                          | Nima bo'ladi                              | To'g'risi                                      |
| --------------------------------------------- | ----------------------------------------- | ---------------------------------------------- |
| Kesishuvchi partition'lar ("0–18" va "18–65") | 18 qaysi guruhga tegishli — noaniq        | Partition'lar kesishmasin                      |
| Invalid partition'larni unutish               | Faqat "baxtli yo'l" tekshiriladi          | Har bir invalid partition — alohida test       |
| Bitta testda ikkita invalid qiymat            | Defect masking                            | Bir testda ko'pi bilan bitta invalid           |
| Tartibsiz to'plamga BVA                       | Ma'nosiz testlar                          | To'lov usuli, `{3, 6, 12}` — faqat EP          |
| Faqat ichki chegaralar                        | Bo'sh qator, max+1 uzunlik tekshirilmaydi | Domen chegaralarini ham yozing                 |
| "3-value = 6 nuqta"                           | Ichki chegarada 2 ta nuqta tushib qoladi  | Har bir ichki chegarada 4 nuqta                |
| "gacha" so'zini tekshirmaslik                 | Chegara kiradimi — noma'lum               | "(shu jumladan)" deb aniqlashtiring            |
| Decision table'ni o'ylamasdan qisqartirish    | Bug yashirinadi                           | Faraz to'g'riligini dasturchi bilan tasdiqlang |

---

## 9. Amaliy mashqlar {#mashqlar}

### Mashq 1: SMS kod uchun EP

DemoBozor'da kirish SMS kod bilan: kod — 6 raqam, 120 soniya amal qiladi, 3 marta noto'g'ri kiritilsa raqam 15 daqiqaga bloklanadi. Kod maydoni uchun **format** va **biznes** partition'larini yozing, har biriga vakil qiymat va kutilgan natija bering.

<details>
<summary>💡 Javobni ko'rish</summary>

**Format partition'lari:**

| Partition            | Vakil     | Kutilgan                                          |
| -------------------- | --------- | ------------------------------------------------- |
| 6 raqam              | `482915`  | Tekshiruvga yuboriladi                            |
| 6 raqam, boshida nol | `012345`  | Tekshiruvga yuboriladi (nol yo'qolmasligi kerak!) |
| 5 raqam              | `48291`   | "Kod 6 raqamdan iborat"                           |
| 7 raqam              | `4829150` | Rad etiladi yoki 6 tadan ortig'i yozilmaydi       |
| Harf bor             | `48a915`  | Rad etiladi                                       |
| Bo'sh                | `""`      | Tugma faol emas yoki xabar                        |
| Probel bilan         | `482 915` | **Talabda yo'q** — so'rash kerak                  |

**Biznes partition'lari:**

| Partition                               | Kutilgan                                  |
| --------------------------------------- | ----------------------------------------- |
| To'g'ri va amaldagi kod (≤ 120 s)       | Kirish muvaffaqiyatli                     |
| To'g'ri, lekin muddati o'tgan (> 120 s) | "Kod muddati tugagan"                     |
| Noto'g'ri kod (1- yoki 2-urinish)       | "Kod noto'g'ri", urinishlar soni kamayadi |
| Noto'g'ri kod (3-urinish)               | Raqam 15 daqiqaga bloklanadi              |
| Bloklangan raqam                        | "Raqam vaqtincha bloklangan"              |

`012345` — eng foydali test: kod son sifatida saqlansa yoki taqqoslansa, bug darhol chiqadi.

</details>

### Mashq 2: bepul yetkazish chegarasi

Qoida: mahsulotlar summasi ≥ 300 000 so'm bo'lsa yetkazish bepul, aks holda 20 000 so'm. Summalar butun so'mda. 2-value va 3-value BVA bo'yicha ichki chegara uchun test qiymatlarini va kutilgan yetkazish narxini yozing.

<details>
<summary>💡 Javobni ko'rish</summary>

Partition'lar: 0–299 999 (20 000 so'm) va 300 000+ (bepul). Chegara qiymatlari: 299 999 va 300 000.

| BVA                  | Summa   | Kutilgan yetkazish |
| -------------------- | ------- | ------------------ |
| 2-value              | 299 999 | 20 000             |
| 2-value              | 300 000 | 0                  |
| 3-value (qo'shimcha) | 299 998 | 20 000             |
| 3-value (qo'shimcha) | 300 001 | 0                  |

Domen chegarasi 0 (va 3-value'da 1) — bo'sh savatcha bilan checkout bo'lmagani uchun amalda infeasible. Buni test hujjatida izoh bilan qayd eting.

</details>

### Mashq 3: muddatli to'lov summasi

Muddatli to'lov 500 000 dan 30 000 000 so'mgacha (ikkala chegara ham kiradi). Partition'larni yozing va 2-value hamda 3-value BVA qiymatlarini sanab chiqing (domen — 0 dan boshlanadigan butun so'm).

<details>
<summary>💡 Javobni ko'rish</summary>

| Partition | Qiymatlar                 | Turi                  |
| --------- | ------------------------- | --------------------- |
| Q         | 0 – 499 999               | invalid (juda kichik) |
| P         | 500 000 – 30 000 000      | valid                 |
| R         | 30 000 001 va undan katta | invalid (juda katta)  |

**2-value:** 0, 499 999, 500 000, 30 000 000, 30 000 001

**3-value:** 0, 1, 499 998, 499 999, 500 000, 500 001, 29 999 999, 30 000 000, 30 000 001, 30 000 002

Kutilgan natija: P ichidagilar (500 000, 500 001, 29 999 999, 30 000 000) — qabul; qolganlari — rad etiladi.

</details>

### Mashq 4: promo-kod

Promo-kod: 6–12 belgi, faqat A–Z va 0–9 (katta harf), har foydalanuvchi bir marta, amal qilish muddati va minimal summa bor. Uzunlik uchun BVA, belgilar va holat uchun EP partition'larini yozing.

<details>
<summary>💡 Javobni ko'rish</summary>

**Uzunlik (BVA):** partition'lar 0–5, 6–12, 13+.

- 2-value: 0, 5, 6, 12, 13
- 3-value: 0, 1, 4, 5, 6, 7, 11, 12, 13, 14

**Belgilar (EP):**

| Partition               | Vakil                           | Kutilgan                                                    |
| ----------------------- | ------------------------------- | ----------------------------------------------------------- |
| A–Z va 0–9              | `BAHOR15`                       | Valid                                                       |
| Kichik harf             | `bahor15`                       | Talabda yo'q: rad etiladimi yoki katta harfga o'giriladimi? |
| Maxsus belgi            | `BAHOR-15`                      | Rad etiladi                                                 |
| Probel                  | `BAHOR 15`                      | Rad etiladi (yoki trim — so'rang)                           |
| Kirill "egizak" harflar | `ВАНОR15` (В, А, Н — kirillcha) | Rad etiladi — ko'rinishi bir xil, kodi boshqa               |
| Emoji                   | `BAHOR🎁`                       | Rad etiladi                                                 |

**Holat (EP):**

| Partition                                          | Kutilgan                           |
| -------------------------------------------------- | ---------------------------------- |
| Amaldagi, minimal summa bajarilgan, birinchi marta | Chegirma qo'llanadi                |
| Muddati o'tgan                                     | "Promo-kod muddati tugagan"        |
| Minimal summa bajarilmagan                         | "Minimal summa: ..."               |
| Shu foydalanuvchi oldin ishlatgan                  | "Promo-kod allaqachon ishlatilgan" |
| Mavjud emas                                        | "Promo-kod topilmadi"              |

Kirill egizak harflar — o'zbek muhitida juda real: klaviatura kirillchada qolib ketgan foydalanuvchi aynan shunday kod yozadi.

</details>

### Mashq 5: bug'ni qaysi qiymat topadi?

Talab: muddatli to'lov 18–65 yosh (shu jumladan). Kod:

```javascript
if (age >= 18 && age < 65) {
  allowInstallment();
}
```

2-value BVA to'plamidagi qaysi qiymat bu bug'ni ochadi? Kutilgan va haqiqiy natijani yozing.

<details>
<summary>💡 Javobni ko'rish</summary>

2-value to'plami: 0, 17, 18, 65, 66.

| Yosh   | Kutilgan  | Haqiqiy (bug'li kod) | Natija         |
| ------ | --------- | -------------------- | -------------- |
| 0      | Rad       | Rad                  | ✅             |
| 17     | Rad       | Rad                  | ✅             |
| 18     | Qabul     | Qabul                | ✅             |
| **65** | **Qabul** | **Rad**              | ❌ Bug topildi |
| 66     | Rad       | Rad                  | ✅             |

Faqat 65 bug'ni ochadi. 40 yoki 50 kabi "o'rtacha" qiymatlar bilan bu bug hech qachon topilmaydi.

</details>

### Mashq 6: SMS kirish uchun decision table

Shartlar: C1 — raqam hozir bloklanganmi; C2 — kod muddati o'tganmi (> 120 s); C3 — kod to'g'rimi; C4 — bu urinish ketma-ket 3-noto'g'ri urinishmi. Harakatlar: kirish, "kod noto'g'ri", "kod eskirgan", raqamni 15 daqiqaga bloklash, "raqam bloklangan". Minimallashtirilgan jadval tuzing va qaysi faraz(lar)ni PO bilan tasdiqlash kerakligini yozing.

<details>
<summary>💡 Javobni ko'rish</summary>

|                             | M1  | M2  | M3  | M4  | M5  |
| --------------------------- | --- | --- | --- | --- | --- |
| **C1:** Bloklangan          | T   | F   | F   | F   | F   |
| **C2:** Muddati o'tgan      | –   | T   | F   | F   | F   |
| **C3:** Kod to'g'ri         | –   | –   | T   | F   | F   |
| **C4:** 3-noto'g'ri urinish | –   | –   | –   | F   | T   |
| Kirish                      |     |     | X   |     |     |
| "Kod noto'g'ri"             |     |     |     | X   | X   |
| "Kod eskirgan"              |     | X   |     |     |     |
| 15 daqiqaga bloklash        |     |     |     |     | X   |
| "Raqam bloklangan"          | X   |     |     |     |     |

To'liq jadvalda 2⁴ = 16 ustun bo'lardi. Minimallashtirilgani — 5 ta, demak 5 ta test.

**PO bilan tasdiqlanadigan farazlar:**

- Muddati o'tgan kod bilan urinish "noto'g'ri urinish" sifatida sanaladimi? (Biz "yo'q" deb oldik — M2.)
- To'g'ri kod kiritilsa, noto'g'ri urinishlar hisoblagichi nolga tushadimi?
- Blok paytida yangi SMS so'rash mumkinmi?

</details>

### Mashq 7: Each Choice — muddatli to'lov formasi

Partition'lar: **Yosh** — `<18`, `18–65`, `>65`; **Summa** — `<500 000`, `500 000–30 000 000`, `>30 000 000`; **Muddat** — `3`, `6`, `12` (valid, har biri o'z grafigini hisoblaydi) va "boshqa" (invalid). Defect masking'siz Each Choice coverage uchun minimal nechta test kerak? Ularni yozing.

<details>
<summary>💡 Javobni ko'rish</summary>

Valid partition'lar: yosh — 1 ta, summa — 1 ta, muddat — 3 ta. Ularni joylash uchun kamida **3** ta to'liq valid test kerak (muddatning uchta qiymati tufayli). Invalid partition'lar: yosh — 2, summa — 2, muddat — 1, jami **5** ta, har biri alohida testda. Jami **8** ta test.

| TC  | Yosh | Summa      | Muddat | Kutilgan     |
| --- | ---- | ---------- | ------ | ------------ |
| E1  | 30   | 1 000 000  | 3      | Qabul        |
| E2  | 45   | 5 000 000  | 6      | Qabul        |
| E3  | 60   | 20 000 000 | 12     | Qabul        |
| E4  | 16   | 1 000 000  | 3      | Rad (yosh)   |
| E5  | 70   | 1 000 000  | 3      | Rad (yosh)   |
| E6  | 30   | 300 000    | 3      | Rad (summa)  |
| E7  | 30   | 35 000 000 | 3      | Rad (summa)  |
| E8  | 30   | 1 000 000  | 9      | Rad (muddat) |

Bu to'plam EP'ni qamraydi. Chegaralar (17/18, 65/66, 499 999/500 000 ...) uchun BVA testlarini alohida qo'shasiz.

</details>

---

## O'zingizni tekshiring {#ozingizni-tekshiring}

- [ ] Har qanday maydon uchun valid va invalid partition'larni kesishmaydigan qilib ajrata olaman
- [ ] Nega bitta testda bitta invalid qiymat bo'lishi kerakligini tushuntira olaman
- [ ] 2-value va 3-value BVA to'plamini white paper bo'yicha to'g'ri hisoblayman
- [ ] BVA qayerda ishlamasligini bilaman (tartibsiz va uzluksiz bo'lmagan to'plamlar)
- [ ] Biznes qoidani to'liq va minimallashtirilgan decision table'ga aylantira olaman
- [ ] Texnikalarni birlashtirib, real forma uchun test to'plami tuza olaman

---

## Xulosa {#xulosa}

- Hammasini tekshirib bo'lmaydi; texnikalar kichik, lekin yetarli to'plamni **tizimli** tanlashga yordam beradi.
- **EP:** har partition'dan bitta vakil; invalid partition'lar ham coverage'ga kiradi; bir testda bitta invalid qiymat.
- **BVA:** faqat tartiblangan partition'larda. 2-value — chegara qiymatlari; 3-value — chegara va ikkala qo'shnisi. Ichki chegarada 3-value to'rtta nuqta beradi.
- 3-value BVA 2-value ko'rmaydigan bug'larni ham topadi (`>=` o'rniga `==` kabi).
- **Decision table** shartlar kombinatsiyasini to'liq ko'rsatadi, minimallashtirish testlar sonini kamaytiradi, eng muhimi — talabdagi bo'shliqlarni ochadi.
- Real ekranda texnikalar birga ishlaydi: EP + BVA + decision table + risk bo'yicha tartiblash.
- **Keyingi dars:** [QA 6: Test dizayn texnikalari (2) — State Transition, Pairwise, Use Case, White-box va Exploratory](/ios-lessons/qa-test-design-2)

## Manbalar {#manbalar}

1. [ISTQB — Certified Tester Foundation Level Syllabus v4.0.1 (PDF)](https://www.istqb.org/wp-content/uploads/2024/11/ISTQB_CTFL_Syllabus_v4.0.1.pdf)
2. [ISTQB — Boundary Value Analysis According to the ISTQB Foundation Level Syllabus (M. Hamburg, A. Roman)](https://istqb.org/wp-content/uploads/2025/10/Boundary-Value-Analysis-white-paper.pdf)
3. [ISTQB Glossary](https://glossary.istqb.org/)
