Testlash Qo'llanmasi
Payme integratsiyangizni qanday test qilishni o'rganing.
Test Muxiti
Payme ishlab chiqarish uchun test muxitini taqdim etadi:
typescript
const payme = new PaymeMerchant({
merchantId: process.env.PAYME_MERCHANT_ID_TEST!,
secretKey: process.env.PAYME_SECRET_KEY_TEST!,
baseURL: 'https://checkout.test.paycom.uz/api' // Test muhiti
});Test Kredit Ma'lumotlari
Test savdochi dashboardiga kirish uchun:
| Parametr | Qiymat |
|---|---|
| Login (Telefon) | phone |
| Parol | qwerty |
| SMS Kod | 666666 |
Barcha Test Kartalar uchun SMS Kodi
Barcha test kartalar uchun SMS tasdiqlash kodi 666666. Bu kod karta turi yoki kutulgan xulq-atvordan qat'iy nazar ishlaydi.
Subscribe API Test Kartalari
Karta tokenizatsiyasi uchun test muhitida quyidagi test karta raqamlaridan foydalaning:
| Karta Raqami | Amal qilish muddati | Izoh |
|---|---|---|
| 8600 0609 2109 0842 | 03/99 | SMS-info ulanmagan |
| 3333 3364 1580 4657 | 03/99 | Karta muddati o'tgan |
| 4444 4459 8745 9073 | 03/99 | Karta bloklangan |
| 8600 1434 1777 0323 | 03/99 | Noma'lum tizim xatosi |
| 8600 1343 0184 9596 | 03/99 | 10 soniya kechikish simulyatsiyasi (xatoda tugaydi) |
| 8600 4954 7331 6478 | 03/99 | Muvaffaqiyat karta |
| 8600 0691 9540 6311 | 03/99 | Muvaffaqiyat karta |
Test Senariylari
- Muvaffaqiyat Kartalari (
8600 4954 7331 6478,8600 0691 9540 6311) - Tokenizatsiya va to'lovni muvaffaqiyatli yakunlaydi - Muddati O'tgan Karta (
3333 3364 1580 4657) - Muddati o'tgan kartalarni to'g'ri ishlashini tekshiring - Bloklangan Karta (
4444 4459 8745 9073) - Bloklangan karta xatosini ishlashini sinab ko'ring - SMS Ulanmagan (
8600 0609 2109 0842) - SMS tasdiqlash mavjud bo'lmaganda stsenariyni sinab ko'ring - Kechikish Simulyatsiyasi (
8600 1343 0184 9596) - Vaqt chegarasini ishlashini tekshiring (xatodan oldin 10 soniya kechikish) - Noma'lum Xato (
8600 1434 1777 0323) - Kutilmagan xatolarni ishlashini tekshiring
Unit Testlash
Mocklar bilan Testlash
typescript
import { describe, test, expect, mock } from 'bun:test';
import { PaymeMerchant } from '@joyida/payme';
describe('To\'lovni Qayta Ishlash', () => {
test('tranzaktsiya yaratishi kerak', async () => {
const payme = new PaymeMerchant({
merchantId: 'test_merchant_id',
secretKey: 'test_secret_key'
});
// HTTP clientni mock qilish
const mockRpcCall = mock(() => Promise.resolve({
create_time: Date.now(),
transaction: '123',
state: 1,
receivers: null
}));
payme['httpClient'].rpcCall = mockRpcCall;
const result = await payme.createTransaction({
id: '5305e3bab097f420a62ced0b',
time: Date.now(),
amount: 500000,
account: { order_id: 'ORD-123' }
});
expect(result.state).toBe(1);
expect(result.transaction).toBe('123');
expect(mockRpcCall).toHaveBeenCalled();
});
});Validatsiyani Testlash
typescript
import { describe, test, expect } from 'bun:test';
import { Validator, ValidationError } from '@joyida/payme';
describe('Validator', () => {
test('summani tekshirishi kerak', () => {
expect(() => Validator.validateAmount(500000)).not.toThrow();
expect(() => Validator.validateAmount(-100)).toThrow(ValidationError);
expect(() => Validator.validateAmount(0)).toThrow(ValidationError);
});
test('karta raqamini tekshirishi kerak', () => {
expect(() => Validator.validateCardNumber('8600069195406311')).not.toThrow();
expect(() => Validator.validateCardNumber('123')).toThrow(ValidationError);
});
test('karta muddatini tekshirishi kerak', () => {
expect(() => Validator.validateCardExpiry('0399')).not.toThrow();
expect(() => Validator.validateCardExpiry('1323')).toThrow(ValidationError);
});
});Xato Ishlashni Testlash
typescript
import { describe, test, expect } from 'bun:test';
import { PaymeError, ValidationError } from '@joyida/payme';
describe('Xato Ishlash', () => {
test('PaymeError ni ishlashi kerak', async () => {
const payme = new PaymeMerchant({
merchantId: 'invalid',
secretKey: 'invalid'
});
try {
await payme.checkPerformTransaction({
amount: 500000,
account: { order_id: 'ORD-123' }
});
expect(true).toBe(false); // Bu yerga yetib kelmasligi kerak
} catch (error) {
expect(error).toBeInstanceOf(PaymeError);
expect(error.code).toBe(-32504);
}
});
test('ValidationError ni ishlashi kerak', () => {
expect(() => {
Validator.validateAmount(-100);
}).toThrow(ValidationError);
});
});Integratsiya Testlash
To'lov Oqimini Testlash
typescript
import { describe, test, expect, beforeAll, afterAll } from 'bun:test';
import { PaymeMerchant, TransactionStates } from '@joyida/payme';
import { Database } from 'bun:sqlite';
describe('To\'lov Oqimi Integratsiyasi', () => {
let db: Database;
let payme: PaymeMerchant;
beforeAll(() => {
// Test ma'lumotlar bazasini sozlash
db = new Database(':memory:');
db.run(`
CREATE TABLE payme_transactions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
payme_id TEXT UNIQUE NOT NULL,
order_id TEXT NOT NULL,
amount INTEGER NOT NULL,
state INTEGER NOT NULL DEFAULT 1,
create_time INTEGER NOT NULL
)
`);
// Payme klientini sozlash
payme = new PaymeMerchant({
merchantId: process.env.PAYME_MERCHANT_ID_TEST!,
secretKey: process.env.PAYME_SECRET_KEY_TEST!,
baseURL: 'https://checkout.test.paycom.uz/api'
});
});
afterAll(() => {
db.close();
});
test('to\'lov oqimini yakunlashi kerak', async () => {
const orderId = `ORD-${Date.now()}`;
const amount = 500000;
const paymeId = generatePaymeId();
// 1. To'lov mumkinligini tekshirish
const check = await payme.checkPerformTransaction({
amount,
account: { order_id: orderId }
});
expect(check.allow).toBe(true);
// 2. Tranzaktsiya yaratish
const created = await payme.createTransaction({
id: paymeId,
time: Date.now(),
amount,
account: { order_id: orderId }
});
expect(created.state).toBe(1);
// 3. Ma'lumotlar bazasiga saqlash
db.run(`
INSERT INTO payme_transactions
(payme_id, order_id, amount, state, create_time)
VALUES (?, ?, ?, ?, ?)
`, [paymeId, orderId, amount, created.state, created.create_time]);
// 4. Tranzaktsiyani bajarish
const performed = await payme.performTransaction({
id: paymeId
});
expect(performed.state).toBe(TransactionStates.COMPLETED);
// 5. Ma'lumotlar bazasida tasdiqlash
const dbTransaction = db.query(`
SELECT * FROM payme_transactions WHERE payme_id = ?
`).get(paymeId);
expect(dbTransaction).toBeDefined();
expect(dbTransaction.order_id).toBe(orderId);
});
});Karta Tokenizatsiyasini Testlash
typescript
import { describe, test, expect } from 'bun:test';
import { PaymeSubscribe } from '@joyida/payme';
describe('Karta Tokenizatsiyasi', () => {
test('kartani tokenizatsiya qilishi kerak', async () => {
const subscribeClient = new PaymeSubscribe({
merchantId: process.env.PAYME_MERCHANT_ID_TEST!
}, 'client');
// Karta tokenini yaratish
const created = await subscribeClient.cardsCreate({
card: {
number: '8600069195406311',
expire: '0399'
},
save: true
});
expect(created.card.token).toBeDefined();
expect(created.card.verify).toBe(false);
// SMS kod so'rash
const sms = await subscribeClient.cardsGetVerifyCode({
token: created.card.token
});
expect(sms.sent).toBe(true);
expect(sms.phone).toBeDefined();
// Kartani tasdiqlash (test kodidan foydalanish)
const verified = await subscribeClient.cardsVerify({
token: created.card.token,
code: '666666' // Test kodi
});
expect(verified.card.verify).toBe(true);
});
});Qo'lda Testlash
Test Kontrol Ro'yxati
- [ ] Tranzaktsiya yaratish
- [ ] Tranzaktsiyani bajarish
- [ ] Perform dan oldin tranzaktsiyani bekor qilish
- [ ] Perform dan keyin tranzaktsiyani bekor qilish (qaytarish)
- [ ] Tranzaktsiya holatini tekshirish
- [ ] Hisobnatishni olish
- [ ] Karta tokenini yaratish
- [ ] Kartani tasdiqlash
- [ ] Karta holatini tekshirish
- [ ] Karta tokenini o'chirish
- [ ] Chek yaratish
- [ ] Chek to'lash
- [ ] Chek SMS yuborish
- [ ] Chekni bekor qilish
- [ ] Chek tafsilotlarini olish
Test Skripti
typescript
import { PaymeMerchant, PaymeSubscribe } from '@joyida/payme';
async function runTests() {
const payme = new PaymeMerchant({
merchantId: process.env.PAYME_MERCHANT_ID_TEST!,
secretKey: process.env.PAYME_SECRET_KEY_TEST!,
baseURL: 'https://checkout.test.paycom.uz/api'
});
console.log('🧪 Payme integratsiya testlarini ishga tushirish...\n');
// Test 1: Performni tekshirish
console.log('1️⃣ CheckPerformTransaction ni testlash...');
try {
const check = await payme.checkPerformTransaction({
amount: 500000,
account: { order_id: 'TEST-001' }
});
console.log('✅ CheckPerformTransaction:', check.allow);
} catch (error) {
console.error('❌ CheckPerformTransaction muvaffaqiyatsiz:', error.message);
}
// Test 2: Tranzaktsiya yaratish
console.log('\n2️⃣ CreateTransaction ni testlash...');
const paymeId = generatePaymeId();
try {
const created = await payme.createTransaction({
id: paymeId,
time: Date.now(),
amount: 500000,
account: { order_id: 'TEST-001' }
});
console.log('✅ CreateTransaction:', created.state);
} catch (error) {
console.error('❌ CreateTransaction muvaffaqiyatsiz:', error.message);
}
// Test 3: Tranzaktsiyani bajarish
console.log('\n3️⃣ PerformTransaction ni testlash...');
try {
const performed = await payme.performTransaction({
id: paymeId
});
console.log('✅ PerformTransaction:', performed.state);
} catch (error) {
console.error('❌ PerformTransaction muvaffaqiyatsiz:', error.message);
}
// Test 4: Tranzaktsiyani tekshirish
console.log('\n4️⃣ CheckTransaction ni testlash...');
try {
const status = await payme.checkTransaction({
id: paymeId
});
console.log('✅ CheckTransaction:', status.state);
} catch (error) {
console.error('❌ CheckTransaction muvaffaqiyatsiz:', error.message);
}
console.log('\n✅ Barcha testlar yakunlandi!');
}
runTests();Unumdorlik Testlash
Yuklama Testlash
typescript
import { PaymeMerchant } from '@joyida/payme';
async function loadTest(concurrency: number, requests: number) {
const payme = new PaymeMerchant({
merchantId: process.env.PAYME_MERCHANT_ID_TEST!,
secretKey: process.env.PAYME_SECRET_KEY_TEST!
});
const startTime = Date.now();
const promises = [];
for (let i = 0; i < requests; i++) {
promises.push(
payme.checkPerformTransaction({
amount: 500000,
account: { order_id: `TEST-${i}` }
})
);
// Concurrencyni boshqarish
if (promises.length >= concurrency) {
await Promise.all(promises);
promises.length = 0;
}
}
// Qolgan so'rovlarni kutish
if (promises.length > 0) {
await Promise.all(promises);
}
const endTime = Date.now();
const duration = endTime - startTime;
const rps = (requests / duration) * 1000;
console.log(`${requests} ta so'rov ${duration}ms da yakunlandi`);
console.log(`O'rtacha: ${rps.toFixed(2)} so'rov/soniya`);
}
// Yuklama testini ishga tushirish
loadTest(10, 100); // 10 ta concurrent so'rov, 100 ta jamiEng Yaxshi Amaliyotlar
✅ Kerakli ishlar
- Ishlab chiqarish uchun test muhitidan foydalaning
- Barcha xato stsenariylarini testing
- Turli karta raqamlari bilan testing
- Vaqt tugashi ishlashini testing
- Idempotentlikni testing
- Ma'lumotlar bazasi integratsiyasini testing
- Ishga tushirishdan oldin integratsiya testlarini o'tkazing
❌ Kerakli emaslar
- Ishlab chiqarishda testing qilmang
- Xato testingni o'tkazib yubormang
- Vaqt tugashi testlarini e'tiborsiz qoldirmang
- Bekor qilish testingni unutmang
- Validatsiya testlarini o'tkazib yubormang
Keyingi Qadamlar
- To'lov Oqimi haqida bilib oling
- Xatolarni Ishlash ni o'rganing
- To'liq Misollarni tekshiring
- Ma'lumotlar Bazasi Integratsiyasini ko'ring