1. Install k6 on Windows
You have a few options. I’ll show the two easiest:
Option A – Using winget (recommended if available)
- Open Windows Terminal / PowerShell as Administrator.
- Run:
winget install grafana.k6 - After install, verify:
k6 versionYou should see something like:k6 v0.xx.x
Option B – Using Chocolatey
If you’re already using Chocolatey:
- Open PowerShell (Admin).
- Install:
choco install k6 - Verify:
k6 version
Option C – Portable (ZIP) Binary (no package manager)
- Go to:
https://github.com/grafana/k6/releases(in your browser). - Download the latest Windows x64 .zip.
- Extract it to a folder, e.g.:
C:\tools\k6\ - Add that folder to your PATH:
- Press
Win→ search Environment Variables → “Edit the system environment variables”. - Click Environment Variables…
- Under User variables or System variables, select
Path→ Edit → New → add:C:\tools\k6\ - Click OK several times.
- Press
- Open a new PowerShell and run:
k6 version
2. Create a Project Folder
Let’s keep things clean.
- Choose a workspace folder, e.g.:
mkdir C:\k6-demo cd C:\k6-demo - You’ll put all your k6 scripts here.
3. Your First “Hello World” k6 Script
We’ll create a very simple script that:
- Sends 1 HTTP GET request to a test URL.
- Checks that the response status is 200.
- Prints basic stats at the end.
3.1 Create the script file
- In
C:\k6-demo, create a file namedhello-world.js.
If you like using Notepad:
notepad .\hello-world.js
Code language: CSS (css)
Paste this code inside:
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
vus: 1, // number of virtual users
duration: '10s', // total test duration
};
export default function () {
// 1) Make a simple GET request
const res = http.get('https://test.k6.io');
// 2) Validate response
check(res, {
'status is 200': (r) => r.status === 200,
});
// 3) Small pause between iterations
sleep(1);
}
Code language: JavaScript (javascript)
Save and close the file.
4. Run the Hello World Test
From inside the folder:
cd C:\k6-demo
k6 run .\hello-world.js
Code language: CSS (css)
You will see something like:
/\ |‾‾| /‾‾/ /‾‾/
/\ / \ | |/ / / /
/ \/ \ | ( / /
/ \ | |\ \/ /
/ __________ \ |__| \____/
execution: local
script: hello-world.js
output: -
scenarios: (100.00%) 1 scenario, 1 max VUs, 10s max duration (incl. graceful stop):
* default: 1 looping VUs for 10s (gracefulStop: 30s)
running (10.0s), 0/1 VUs, 10 complete and 0 interrupted iterations
default ✓ [======================================] 1 VUs 10s
✓ status is 200
checks...................: 100.00% ✓ 10 ✗ 0
http_req_duration........: avg=150ms min=120ms max=200ms ...
http_reqs................: 10 (1.0/s)
vus......................: 1
Code language: PHP (php)
5. Understand the Output
Important fields to understand:
- checks – shows how many checks passed/failed:
✓ 10 ✗ 0→ all 10 requests returned status 200.
- http_req_duration – time it took to complete each HTTP request.
avg,min,max, percentiles.
- http_reqs – total number of HTTP requests (10 here).
- vus – how many virtual users were active (1 here).
Since status is 200 is the only check, if the website failed or returned a different code, you’d see failed checks.
6. Slightly More Interesting Example (Hello World with Threshold)
Now, let’s add a threshold so the test “fails” if latency is too high.
Create another file: hello-with-threshold.js
notepad .\hello-with-threshold.js
Code language: JavaScript (javascript)
Paste:
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
vus: 2,
duration: '15s',
thresholds: {
// 95% of all requests must finish below 500ms
http_req_duration: ['p(95) < 500'],
// At least 99% of checks must pass
checks: ['rate > 0.99'],
},
};
export default function () {
const res = http.get('https://test.k6.io');
check(res, {
'status is 200': (r) => r.status === 200,
});
sleep(1);
}
Code language: JavaScript (javascript)
Run it:
k6 run .\hello-with-threshold.js
Code language: JavaScript (javascript)
At the end, you’ll see something like:
checks................: 100.00% ✓ 30 ✗ 0
http_req_duration.....: p(95)=180ms ...
thresholds:
* http_req_duration p(95)<500 ✓ passed
* checks rate>0.99 ✓ passed
Code language: HTML, XML (xml)
If you intentionally use a slow or broken URL, you might see thresholds marked as failed with ✗.
7. Running a Quick “Smoke Test” Style Hello World
If you just want to quickly confirm your script works (like a smoke test):
Create hello-smoke.js:
notepad .\hello-smoke.js
Code language: CSS (css)
Paste:
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
vus: 1,
iterations: 1, // run only once
};
export default function () {
const res = http.get('https://test.k6.io');
console.log(`Response status: ${res.status}`);
sleep(1);
}
Code language: JavaScript (javascript)
Run:
k6 run .\hello-smoke.js
Code language: CSS (css)
You’ll see a log line:
INFO[0000] Response status: 200
Code language: CSS (css)
This is a super basic “Hello World” just to embed k6 in a CI step or script.
8. Typical Folder Structure for Your k6 Work
If you continue learning, you might organize like:
C:\k6-demo
├─ hello-world.js
├─ hello-with-threshold.js
├─ hello-smoke.js
├─ scenarios/
│ ├─ basic-load.js
│ ├─ spike-test.js
├─ data/
│ └─ users.csv
Code language: JavaScript (javascript)
9. Next Easy Steps After Hello World
Once this works, good next things to explore:
- Increase load
Change:vus: 10, duration: '30s', - Add multiple URLs
Usegroup()blocks and multiplehttp.getcalls. - Export results to JSON (for later analysis):
k6 run --out json=results.json .\hello-world.js - Integrate with Grafana later (Prometheus or k6 Cloud), once you’re comfortable.
I’m a DevOps/SRE/DevSecOps/Cloud Expert passionate about sharing knowledge and experiences. I have worked at Cotocus. I share tech blog at DevOps School, travel stories at Holiday Landmark, stock market tips at Stocks Mantra, health and fitness guidance at My Medic Plus, product reviews at TrueReviewNow , and SEO strategies at Wizbrand.
Do you want to learn Quantum Computing?
Please find my social handles as below;
Rajesh Kumar Personal Website
Rajesh Kumar at YOUTUBE
Rajesh Kumar at INSTAGRAM
Rajesh Kumar at X
Rajesh Kumar at FACEBOOK
Rajesh Kumar at LINKEDIN
Rajesh Kumar at WIZBRAND