k6 對於常見的測試進行了多種說明,同時也有比較詳細的講解還是很不錯的
常見參考測試類型
簡單說明
- (smoke test) 冒煙測試, 驗證系統的最小負載,而不會出現任何問題
- (load tet)負載測試, 主要根據並發用戶以及每秒請求評估系統性能
- (stress test,spike test) 壓力測試&&峰值測試,評估系統極限以及極端條件下的穩定性
- (soak test)浸泡測試,系統長時間穩定性測試
冒煙測試實例
- 參考配置
import http from 'k6/http';
import { check, group, sleep, fail } from 'k6';
export let options = {
vus: 1, // 1 user looping for 1 minute
duration: '1m',
thresholds: {
http_req_duration: ['p(99)<1500'], // 99% of requests must complete below 1.5s
},
};
const BASE_URL = 'https://test-api.k6.io';
const USERNAME = 'TestUser';
const PASSWORD = 'SuperCroc2020';
export default () => {
let loginRes = http.post(`${BASE_URL}/auth/token/login/`, {
username: USERNAME,
password: PASSWORD,
});
check(loginRes, {
'logged in successfully': (resp) => resp.json('access') !== '',
});
let authHeaders = {
headers: {
Authorization: `Bearer ${loginRes.json('access')}`,
},
};
let myObjects = http.get(`${BASE_URL}/my/crocodiles/`, authHeaders).json();
check(myObjects, { 'retrieved crocodiles': (obj) => obj.length > 0 });
sleep(1);
};
負載測試
- 參考配置
import http from 'k6/http';
import { check, group, sleep } from 'k6';
export let options = {
stages: [
{ duration: '5m', target: 100 }, // simulate ramp-up of traffic from 1 to 100 users over 5 minutes.
{ duration: '10m', target: 100 }, // stay at 100 users for 10 minutes
{ duration: '5m', target: 0 }, // ramp-down to 0 users
],
thresholds: {
http_req_duration: ['p(99)<1500'], // 99% of requests must complete below 1.5s
'logged in successfully': ['p(99)<1500'], // 99% of requests must complete below 1.5s
},
};
const BASE_URL = 'https://test-api.k6.io';
const USERNAME = 'TestUser';
const PASSWORD = 'SuperCroc2020';
export default () => {
let loginRes = http.post(`${BASE_URL}/auth/token/login/`, {
username: USERNAME,
password: PASSWORD,
});
check(loginRes, {
'logged in successfully': (resp) => resp.json('access') !== '',
});
let authHeaders = {
headers: {
Authorization: `Bearer ${loginRes.json('access')}`,
},
};
let myObjects = http.get(`${BASE_URL}/my/crocodiles/`, authHeaders).json();
check(myObjects, { 'retrieved crocodiles': (obj) => obj.length > 0 });
sleep(1);
};
壓力&&峰值測試
- 壓力
import http from 'k6/http';
import { sleep } from 'k6';
export let options = {
stages: [
{ duration: '2m', target: 100 }, // below normal load
{ duration: '5m', target: 100 },
{ duration: '2m', target: 200 }, // normal load
{ duration: '5m', target: 200 },
{ duration: '2m', target: 300 }, // around the breaking point
{ duration: '5m', target: 300 },
{ duration: '2m', target: 400 }, // beyond the breaking point
{ duration: '5m', target: 400 },
{ duration: '10m', target: 0 }, // scale down. Recovery stage.
],
};
export default function () {
const BASE_URL = 'https://test-api.k6.io'; // make sure this is not production
let responses = http.batch([
[
'GET',
`${BASE_URL}/public/crocodiles/1/`,
null,
{ tags: { name: 'PublicCrocs' } },
],
[
'GET',
`${BASE_URL}/public/crocodiles/2/`,
null,
{ tags: { name: 'PublicCrocs' } },
],
[
'GET',
`${BASE_URL}/public/crocodiles/3/`,
null,
{ tags: { name: 'PublicCrocs' } },
],
[
'GET',
`${BASE_URL}/public/crocodiles/4/`,
null,
{ tags: { name: 'PublicCrocs' } },
],
]);
sleep(1);
}
- 峰值測試
import http from 'k6/http';
import { sleep } from 'k6';
export let options = {
stages: [
{ duration: '10s', target: 100 }, // below normal load
{ duration: '1m', target: 100 },
{ duration: '10s', target: 1400 }, // spike to 1400 users
{ duration: '3m', target: 1400 }, // stay at 1400 for 3 minutes
{ duration: '10s', target: 100 }, // scale down. Recovery stage.
{ duration: '3m', target: 100 },
{ duration: '10s', target: 0 },
],
};
export default function () {
const BASE_URL = 'https://test-api.k6.io'; // make sure this is not production
let responses = http.batch([
[
'GET',
`${BASE_URL}/public/crocodiles/1/`,
null,
{ tags: { name: 'PublicCrocs' } },
],
[
'GET',
`${BASE_URL}/public/crocodiles/2/`,
null,
{ tags: { name: 'PublicCrocs' } },
],
[
'GET',
`${BASE_URL}/public/crocodiles/3/`,
null,
{ tags: { name: 'PublicCrocs' } },
],
[
'GET',
`${BASE_URL}/public/crocodiles/4/`,
null,
{ tags: { name: 'PublicCrocs' } },
],
]);
sleep(1);
}
浸泡測試
- 參考
import http from 'k6/http';
import { sleep } from 'k6';
export let options = {
stages: [
{ duration: '2m', target: 400 }, // ramp up to 400 users
{ duration: '3h56m', target: 400 }, // stay at 400 for ~4 hours
{ duration: '2m', target: 0 }, // scale down. (optional)
],
};
const API_BASE_URL = 'https://test-api.k6.io';
export default function () {
http.batch([
['GET', `${API_BASE_URL}/public/crocodiles/1/`],
['GET', `${API_BASE_URL}/public/crocodiles/2/`],
['GET', `${API_BASE_URL}/public/crocodiles/3/`],
['GET', `${API_BASE_URL}/public/crocodiles/4/`],
]);
sleep(1);
}
說明
以上內容來自官方文檔,還是很不錯的,也是我們進行測試值得參考的流程