47 KiB
Test Steps: Location Features
HRMS Check-in/Check-out System
Document Information
| Field | Value |
|---|---|
| Document Version | 1.0.0 |
| Last Updated | 2025-03-09 |
| Project | HRMS Check-in/Check-out |
| Module | Location Features |
| Author | QA Team |
Table of Contents
- Overview
- Test Environment Setup
- Manual Testing Procedures
- Mock Location Testing
- Developer Tools Testing
- Device-Specific Testing
- Test Data & Scenarios
- Troubleshooting
1. Overview
เอกสารนี้ประกอบด้วยขั้นตอนการทดสอบ (Test Steps) แบบละเอียดสำหรับการทดสอบฟีเจอร์ Location ของระบบ HRMS Check-in/Check-out โดยเน้นการทดสอบแบบ Manual Testing และการจำลองสถานการณ์ต่าง ๆ
1.1 Testing Scope
| Area | Description |
|---|---|
| Location Permission | การขอและการจัดการสิทธิ์การเข้าถึงตำแหน่ง |
| Location Acquisition | การรับพิกัด GPS จากอุปกรณ์ |
| Location Validation | การตรวจสอบความถูกต้องของตำแหน่ง |
| Mock Detection | การตรวจจับการจำลองตำแหน่ง |
| POI Resolution | การแปลงพิกัดเป็นชื่อสถานที่ |
| Check-in/Check-out | การลงเวลาเข้า-ออกงานพร้อมตำแหน่ง |
| Privacy Consent | การขอความยินยอมการใช้ข้อมูล |
2. Test Environment Setup
2.1 Device Preparation
2.1.1 Android Device Setup
-
Enable Developer Options
- เปิด Settings > About Phone
- แตะที่ Build Number 7 ครั้ง
- กลับมาที่ Settings > Developer Options
-
Enable Mock Location (สำหรับการทดสอบ)
- เปิด Settings > Developer Options
- เลือก "Select mock location app"
- เลือก Fake GPS Location App ที่ติดตั้ง
-
Install Fake GPS Apps
- Fake GPS Location (by Lexa) - Google Play
- GPS Joystick - Google Play
2.1.2 iOS Device Setup
-
Xcode Simulation (ต้องใช้ Mac)
- เปิด Xcode
- เลือก Device > Debug Location > Custom Location...
- ป้อน Latitude และ Longitude
-
Location Changer Apps
- Location Changer - App Store
2.1.3 Desktop Browser Setup
-
Chrome DevTools
- กด F12 หรือ Cmd+Option+I (Mac) / Ctrl+Shift+I (Windows)
- เลือก More tools > Sensors
- ตั้งค่า Location ใน Sensors tab
-
Edge DevTools
- กด F12
- เลือก More tools > Sensors
- ตั้งค่า Location ใน Sensors tab
2.2 Network Setup
| Scenario | Setup |
|---|---|
| Normal Network | WiFi/4G/5G เชื่อมต่อปกติ |
| Slow Network | Chrome DevTools > Network > Throttling > Slow 3G |
| Offline | Chrome DevTools > Network > Offline |
| GPS Blocking | Disable Location Service ในระบบ |
2.3 Test Location Data
| Location Name | Latitude | Longitude | Notes |
|---|---|---|---|
| Sanam Suea Pa (สนามเสือป่า) | 13.7563 | 100.5018 | Bangkok Government Office |
| Suvarnabhumi Airport | 13.6900 | 100.7501 | Outdoor, high GPS accuracy |
| Central World | 13.7944 | 100.5439 | Indoor shopping mall |
| Null Island | 0 | 0 | Default mock location (invalid) |
| Out of Range | 91 | 181 | Invalid coordinates |
| Chiang Mai | 18.7883 | 98.9853 | Northern Thailand |
3. Manual Testing Procedures
3.1 TC-LOC-01: Location Permission Testing
Test Case: TC-LOC-01-01 - อนุญาตให้เข้าถึงตำแหน่ง
Objective: ทดสอบการอนุญาตให้เข้าถึงตำแหน่ง
| Step | Action | Expected Result | Screenshot |
|---|---|---|---|
| 1 | เปิดแอป HRMS ครั้งแรก | แสดงหน้าแรกของแอป | [ ] |
| 2 | แสดง Privacy Modal (ถ้ายังไม่ยอมรับ) | แสดง Privacy Policy Modal | [ ] |
| 3 | กด "ยอมรับ" เพื่อยอมรับ Privacy Policy | Modal ปิด, isAccepted = true |
[ ] |
| 4 | กดปุ่มขอตำแหน่ง (mapRef.requestLocationPermission()) | ระบบขอ Location Permission | [ ] |
| 5 | เลือก "Allow" เมื่อระบบขอ Location Permission | รับสิทธิ์สำเร็จ | [ ] |
| 6 | รอรับพิกัด GPS | แสดง Skeleton loading | [ ] |
| 7 | รับพิกัดสำเร็จ | แสดงแผนที่พร้อมตำแหน่งปัจจุบัน | [ ] |
| 8 | ตรวจสอบชื่อสถานที่ใกล้เคียง | แสดงชื่อสถานที่ (POI) | [ ] |
| 9 | ตรวจสอบสถานะปุ่มลงเวลา | ปุ่มใช้งานได้ (disabled = false) | [ ] |
Verification Checklist:
- แผนที่แสดงตำแหน่งปัจจุบันถูกต้อง
- ชื่อสถานที่ใกล้เคียงแสดงถูกต้อง
locationGranted = true- ปุ่มลงเวลาเข้า/ออกใช้งานได้
- ไม่มีข้อความ error แสดงขึ้น
Test Case: TC-LOC-01-02 - ปฏิเสธการเข้าถึงตำแหน่ง
Objective: ทดสอบการปฏิเสธการเข้าถึงตำแหน่ง
| Step | Action | Expected Result | Screenshot |
|---|---|---|---|
| 1 | เปิดแอป HRMS ครั้งแรก | แสดงหน้าแรกของแอป | [ ] |
| 2 | ยอมรับ Privacy Policy | Modal ปิด | [ ] |
| 3 | กดปุ่มขอตำแหน่ง | ระบบขอ Location Permission | [ ] |
| 4 | เลือก "Deny" เมื่อระบบขอ Location Permission | ปฏิเสธสิทธิ์ | [ ] |
| 5 | ตรวจสอบ error message | แสดง "ไม่สามารถระบุตำแหน่งปัจจุบันได้ เนื่องจากคุณปฏิเสธการเข้าถึงตำแหน่ง กรุณาเปิดการเข้าถึงตำแหน่ง" | [ ] |
| 6 | ตรวจสอบแผนที่ | แผนที่ไม่แสดง (poiPlaceName = '') | [ ] |
| 7 | ตรวจสอบปุ่มลงเวลา | ปุ่มใช้งานไม่ได้ (disabled = true) | [ ] |
Verification Checklist:
- แสดง error message ถูกต้อง
- แผนที่ไม่แสดง
locationGranted = false- ปุ่มลงเวลาเข้า/ออก disabled
- ไม่สามารถลงเวลาได้
3.2 TC-LOC-02: Location Acquisition Testing
Test Case: TC-LOC-02-01 - รับพิกัด GPS สำเร็จ (Outdoor)
Objective: ทดสอบการรับพิกัด GPS สำเร็จในพื้นที่เปิดกว้าง
| Step | Action | Expected Result | Screenshot |
|---|---|---|---|
| 1 | ไปยังพื้นที่เปิดกว้าง (Outdoor) | อยู่กลางแจ้ง มีสัญญาณ GPS ดี | [ ] |
| 2 | เปิดแอป HRMS | แสดงหน้าแรก | [ ] |
| 3 | อนุญาต Location Permission | รับสิทธิ์สำเร็จ | [ ] |
| 4 | กดปุ่มขอตำแหน่ง | เริ่มรับพิกัด GPS | [ ] |
| 5 | รอรับพิกัด (ประมาณ 3-5 วินาที) | แสดง Skeleton loading | [ ] |
| 6 | รับพิกัดสำเร็จ | แสดงแผนที่ | [ ] |
| 7 | ตรวจสอบพิกัด | Latitude และ Longitude ถูกต้อง | [ ] |
| 8 | ตรวจสอบความแม่นยำ | Accuracy <= 100 meters | [ ] |
| 9 | ตรวจสอบ timestamp | Timestamp ภายใน 60 วินาที | [ ] |
| 10 | ตรวจสอบชื่อสถานที่ | แสดงชื่อสถานที่ใกล้เคียง | [ ] |
Verification Checklist:
- รับพิกัดสำเร็จ
- พิกัดอยู่ในช่วงที่ถูกต้อง (lat: -90 to 90, lon: -180 to 180)
- ไม่ใช่ (0, 0)
- Accuracy <= 100 meters
- Timestamp ภายใน 60 วินาที
- ชื่อสถานที่ใกล้เคียงแสดงถูกต้อง
Test Case: TC-LOC-02-02 - รับพิกัด GPS สำเร็จ (Indoor)
Objective: ทดสอบการรับพิกัด GPS สำเร็จในพื้นที่ปิด
| Step | Action | Expected Result | Screenshot |
|---|---|---|---|
| 1 | ไปยังพื้นที่ปิด (Indoor) | อยู่ภายในอาคาร | [ ] |
| 2 | เปิดแอป HRMS | แสดงหน้าแรก | [ ] |
| 3 | อนุญาต Location Permission | รับสิทธิ์สำเร็จ | [ ] |
| 4 | กดปุ่มขอตำแหน่ง | เริ่มรับพิกัด GPS | [ ] |
| 5 | รอรับพิกัด (อาจนานกว่าปกติ) | แสดง Skeleton loading | [ ] |
| 6 | รับพิกัดสำเร็จ | แสดงแผนที่ | [ ] |
| 7 | ตรวจสอบพิกัด | Latitude และ Longitude ถูกต้อง | [ ] |
| 8 | ตรวจสอบความแม่นยำ | อาจมีความแม่นยำต่ำกว่า Outdoor | [ ] |
Verification Checklist:
- รับพิกัดสำเร็จ
- อาจมีความแม่นยำต่ำกว่า Outdoor
- แผนที่แสดงถูกต้อง
Test Case: TC-LOC-02-03 - รับพิกัด GPS ล้มเหลว (GPS ไม่ทำงาน)
Objective: ทดสอบกรณี GPS ไม่ทำงาน
| Step | Action | Expected Result | Screenshot |
|---|---|---|---|
| 1 | เปิดแอป HRMS | แสดงหน้าแรก | [ ] |
| 2 | อนุญาต Location Permission | รับสิทธิ์สำเร็จ | [ ] |
| 3 | ไปที่ Settings > Location > ปิด GPS | GPS ปิดอยู่ | [ ] |
| 4 | กดปุ่มขอตำแหน่ง | เริ่มรับพิกัด GPS | [ ] |
| 5 | ตรวจสอบ error message | แสดง "ไม่สามารถระบุตำแหน่งปัจจุบันได้" | [ ] |
| 6 | ตรวจสอบแผนที่ | แผนที่ไม่แสดง | [ ] |
Verification Checklist:
- แสดง error message ถูกต้อง
- แผนที่ไม่แสดง
- ไม่สามารถรับพิกัดได้
3.3 TC-LOC-03: Location Validation Testing
Test Case: TC-LOC-03-01 - พิกัดถูกต้อง (Valid coordinates)
Objective: ทดสอบการตรวจสอบพิกัดที่ถูกต้อง
| Step | Action | Expected Result | Screenshot |
|---|---|---|---|
| 1 | เปิดแอป HRMS | แสดงหน้าแรก | [ ] |
| 2 | อนุญาต Location Permission | รับสิทธิ์สำเร็จ | [ ] |
| 3 | รับพิกัด GPS ปกติ | พิกัดถูกต้อง (เช่น 13.7563, 100.5018) | [ ] |
| 4 | เปิด Console และตรวจสอบ validationResult | { isValid: true, isMockDetected: false } | [ ] |
| 5 | ตรวจสอบ locationGranted | locationGranted = true | [ ] |
| 6 | ตรวจสอบปุ่มลงเวลา | ปุ่มใช้งานได้ | [ ] |
Verification Checklist:
validationResult.isValid = truevalidationResult.isMockDetected = falsevalidationResult.errors = []locationGranted = true- ไม่มี error/warning message
Test Case: TC-LOC-03-02 - พิกัดไม่ถูกต้อง (Invalid coordinates - (0,0))
Objective: ทดสอบการตรวจสอบพิกัด (0,0)
| Step | Action | Expected Result | Screenshot |
|---|---|---|---|
| 1 | เปิด Fake GPS App | เปิดแอป | [ ] |
| 2 | ตั้งค่าพิกัด (0, 0) | Latitude: 0, Longitude: 0 | [ ] |
| 3 | เปิดแอป HRMS | แสดงหน้าแรก | [ ] |
| 4 | กดปุ่มขอตำแหน่ง | เริ่มรับพิกัด GPS | [ ] |
| 5 | ตรวจสอบ Console (validateCoordinates) | validateCoordinates(0, 0) = false | [ ] |
| 6 | ตรวจสอบ validationResult | { isValid: false, isMockDetected: true, confidence: 'high' } | [ ] |
| 7 | ตรวจสอบ error message | "พิกัดตำแหน่งไม่ถูกต้อง กรุณาลองใหม่" | [ ] |
| 8 | ตรวจสอบ disabledBtn | disabledBtn = true | [ ] |
Verification Checklist:
validateCoordinates(0, 0) = falsemockIndicators = 3isMockDetected = trueconfidence = 'high'- แสดง error message ถูกต้อง
- ปุ่มลงเวลา disabled
Test Case: TC-LOC-03-04 - ข้อมูลตำแหน่งเก่าเกินไป (Stale timestamp)
Objective: ทดสอบการตรวจสอบ timestamp เก่าเกิน 60 วินาที
| Step | Action | Expected Result | Screenshot |
|---|---|---|---|
| 1 | เปิด Chrome DevTools | F12 > Sensors | [ ] |
| 2 | เลือก Custom Location | กำหนดพิกัด | [ ] |
| 3 | เปิด Console และเขียน script | จำลอง timestamp เก่า | [ ] |
| 4 | Run script: | ||
| ```javascript | |||
| const stalePosition = { | |||
| coords: { latitude: 13.7563, longitude: 100.5018, accuracy: 10 }, | |||
| timestamp: Date.now() - 70000 // 70 seconds ago | |||
| } | |||
| navigator.geolocation.getCurrentPosition(pos => console.log(pos)) | |||
| ``` | |||
| 5 | รีเฟรชแอป | รับพิกัด | [ ] |
| 6 | ตรวจสอบ validationResult | mockIndicators += 2 | [ ] |
| 7 | ตรวจสอบ error message | "ข้อมูลตำแหน่งเก่าเกินไป กรุณารับสัญญาณ GPS ใหม่" | [ ] |
Verification Checklist:
validateTimestamp(staleTimestamp) = falsemockIndicators += 2- แสดง error message ถูกต้อง
Test Case: TC-LOC-03-05 - ความแม่นยำต่ำ (Poor accuracy)
Objective: ทดสอบการตรวจสอบความแม่นยำต่ำ
| Step | Action | Expected Result | Screenshot |
|---|---|---|---|
| 1 | เปิด Chrome DevTools | F12 > Sensors | [ ] |
| 2 | เลือก Custom Location | กำหนดพิกัด | [ ] |
| 3 | เปิด Console และเขียน script | จำลอง accuracy ต่ำ | [ ] |
| 4 | Run script: | ||
| ```javascript | |||
| const poorAccuracyPosition = { | |||
| coords: { latitude: 13.7563, longitude: 100.5018, accuracy: 150 }, | |||
| timestamp: Date.now() | |||
| } | |||
| ``` | |||
| 5 | รีเฟรชแอป | รับพิกัด | [ ] |
| 6 | ตรวจสอบ validationResult | warnings = ["ความแม่นยำตำแหน่งต่ำเกินไป..."] | [ ] |
| 7 | ตรวจสอบ mockIndicators | mockIndicators += 1 | [ ] |
Verification Checklist:
validateAccuracy(150) = falsemockIndicators += 1- แสดง warning message ถูกต้อง
Test Case: TC-LOC-03-06 - ความเร็วเคลื่อนที่ผิดปกติ (Impossible speed)
Objective: ทดสอบการตรวจสอบความเร็วเคลื่อนที่ผิดปกติ
| Step | Action | Expected Result | Screenshot |
|---|---|---|---|
| 1 | เปิดแอป HRMS ที่ตำแหน่ง A (13.7563, 100.5018) | รับพิกัด A | [ ] |
| 2 | รอสักครู่เพื่อให้บันทึกตำแหน่ง A ลง history | previousPositions มีค่า | [ ] |
| 3 | เปิด Fake GPS App | เปิดแอป | [ ] |
| 4 | ตั้งค่าพิกัด B (15.8700, 100.9925) ที่ห่างกัน ~180 กม. | พิกัด B | [ ] |
| 5 | รีเฟรชแอปทันที (ภายใน 60 วินาที) | รับพิกัด B | [ ] |
| 6 | ตรวจสอบ Console (calculateSpeed) | speed = ~3000 km/h (> 100 m/s) | [ ] |
| 7 | ตรวจสอบ validationResult | mockIndicators += 3 | [ ] |
| 8 | ตรวจสอบ error message | "ตรวจพบการเคลื่อนที่ด้วยความเร็วผิดปกติ..." | [ ] |
Verification Checklist:
calculateSpeed()= ความเร็ว > 100 m/smockIndicators += 3- แสดง error message ถูกต้อง
3.4 TC-LOC-04: Mock Location Detection Testing
Test Case: TC-LOC-04-01 - ไม่พบ Mock Location (Normal GPS)
Objective: ทดสอบการใช้งาน GPS ปกติ ไม่พบ mock location
| Step | Action | Expected Result | Screenshot |
|---|---|---|---|
| 1 | ตรวจสอบว่าปิด Fake GPS App | ไม่มี Fake GPS App ทำงาน | [ ] |
| 2 | เปิดแอป HRMS | แสดงหน้าแรก | [ ] |
| 3 | อนุญาต Location Permission | รับสิทธิ์สำเร็จ | [ ] |
| 4 | กดปุ่มขอตำแหน่ง | เริ่มรับพิกัด GPS | [ ] |
| 5 | รับพิกัดสำเร็จ | แสดงแผนที่ | [ ] |
| 6 | ตรวจสอบ Console (validationResult) | { isValid: true, isMockDetected: false } | [ ] |
| 7 | ตรวจสอบ locationGranted | locationGranted = true | [ ] |
| 8 | ตรวจสอบ isMockLocationDetected | isMockLocationDetected = false | [ ] |
| 9 | ตรวจสอบปุ่มลงเวลา | ปุ่มใช้งานได้ | [ ] |
Verification Checklist:
isValid = trueisMockDetected = falselocationGranted = trueisMockLocationDetected = false- ปุ่มลงเวลาใช้งานได้
Test Case: TC-LOC-04-02 - พบ Mock Location - Fake GPS App
Objective: ทดสอบการตรวจจับ mock location จาก Fake GPS App
| Step | Action | Expected Result | Screenshot |
|---|---|---|---|
| 1 | เปิด Fake GPS Location App | เปิดแอป | [ ] |
| 2 | ตั้งค่าตำแหน่งปลอง (เช่น 13.7563, 100.5018) | ตั้งค่าสำเร็จ | [ ] |
| 3 | เปิด Developer Options > Select mock location app | เลือก Fake GPS App | [ ] |
| 4 | เปิดแอป HRMS | แสดงหน้าแรก | [ ] |
| 5 | กดปุ่มขอตำแหน่ง | เริ่มรับพิกัด GPS | [ ] |
| 6 | รับพิกัดจาก Fake GPS | แสดงพิกัดปลอง | [ ] |
| 7 | ตรวจสอบ Console (validationResult) | isMockDetected = true | [ ] |
| 8 | ตรวจสอบ mockIndicators | mockIndicators >= 3 | [ ] |
| 9 | ตรวจสอบ error message | "ตรวจพบว่าตำแหน่ง GPS อาจไม่ถูกต้อง..." | [ ] |
| 10 | ตรวจสอบ isMockLocationDetected | isMockLocationDetected = true | [ ] |
| 11 | ตรวจสอบ disabledBtn | disabledBtn = true | [ ] |
| 12 | พยายามกดปุ่มลงเวลา | กดไม่ได้ | [ ] |
Verification Checklist:
isMockDetected = truemockIndicators >= 3- แสดง error message ถูกต้อง
isMockLocationDetected = truedisabledBtn = true- ไม่สามารถลงเวลาได้
3.5 TC-LOC-05: POI Resolution Testing
Test Case: TC-LOC-05-01 - แปลงพิกัดเป็นชื่อสถานที่สำเร็จ (Bangkok GIS)
Objective: ทดสอบการแปลงพิกัดเป็นชื่อสถานที่สำเร็จผ่าน Bangkok GIS API
| Step | Action | Expected Result | Screenshot |
|---|---|---|---|
| 1 | เปิดแอป HRMS | แสดงหน้าแรก | [ ] |
| 2 | อนุญาต Location Permission | รับสิทธิ์สำเร็จ | [ ] |
| 3 | กดปุ่มขอตำแหน่ง | เริ่มรับพิกัด GPS | [ ] |
| 4 | รับพิกัดสำเร็จ | แสดงแผนที่ | [ ] |
| 5 | เปิด Network Tab (DevTools) | แสดง requests | [ ] |
| 6 | ตรวจสอบ request ไป Bangkok GIS | GET https://bmagis.bangkok.go.th/... |
[ ] |
| 7 | ตรวจสอบ response | status = 200, มี PlaceName | [ ] |
| 8 | ตรวจสอบ poiPlaceName | poiPlaceName มีค่า | [ ] |
| 9 | ตรวจสอบ formLocation.POI | formLocation.POI มีค่า | [ ] |
| 10 | ตรวจสอบหน้าจอ | แสดงชื่อสถานที่ใกล้เคียง | [ ] |
Verification Checklist:
- เรียก Bangkok GIS API สำเร็จ
- Response มี PlaceName
poiPlaceNameมีค่า- แสดงชื่อสถานที่ใกล้เคียงถูกต้อง
Test Case: TC-LOC-05-02 - แปลงพิกัดเป็นชื่อสถานที่สำเร็จ (ArcGIS Fallback)
Objective: ทดสอบการแปลงพิกัดเป็นชื่อสถานที่สำเร็จผ่าน ArcGIS API (เมื่อ Bangkok GIS fail)
| Step | Action | Expected Result | Screenshot |
|---|---|---|---|
| 1 | เปิด Chrome DevTools > Network Tab | แสดง requests | [ ] |
| 2 | เปิด Throttling > Offline | จำลอง Bangkok GIS down | [ ] |
| 3 | เปิดแอป HRMS | แสดงหน้าแรก | [ ] |
| 4 | อนุญาต Location Permission | รับสิทธิ์สำเร็จ | [ ] |
| 5 | กดปุ่มขอตำแหน่ง | เริ่มรับพิกัด GPS | [ ] |
| 6 | รับพิกัดสำเร็จ | แสดงแผนที่ | [ ] |
| 7 | ปิด Throttling (กลับสู่ Online) | Bangkok GIS ยังไม่พร้อม | [ ] |
| 8 | ตรวจสอบ Console | Bangkok GIS API fail | [ ] |
| 9 | ตรวจสอบ fallback | เรียก ArcGIS API | [ ] |
| 10 | ตรวจสอบ response | GET https://geocode.arcgis.com/... |
[ ] |
| 11 | ตรวจสอบ poiPlaceName | poiPlaceName มีค่า | [ ] |
Verification Checklist:
- Bangkok GIS API fail
- Fallback ไป ArcGIS API สำเร็จ
poiPlaceNameมีค่า- แสดงชื่อสถานที่ใกล้เคียง
3.6 TC-LOC-06: Check-in with Location Testing
Test Case: TC-LOC-06-01 - ลงเวลาเข้าสำเร็จ - ณ สถานที่ตั้ง (In-place)
Objective: ทดสอบการลงเวลาเข้าสำเร็จเมื่ออยู่ ณ สถานที่ตั้ง
| Step | Action | Expected Result | Screenshot |
|---|---|---|---|
| 1 | เปิดแอป HRMS | แสดงหน้าแรก | [ ] |
| 2 | ตรวจสอบ statusCheckin | statusCheckin = true (เข้างาน) | [ ] |
| 3 | อนุญาต Location Permission | รับสิทธิ์สำเร็จ | [ ] |
| 4 | กดปุ่มขอตำแหน่ง | รับพิกัดสำเร็จ | [ ] |
| 5 | ถ่ายรูปภาพ | แสดงรูปที่ถ่าย | [ ] |
| 6 | เลือก "ในสถานที่" | workplace = 'in-place' | [ ] |
| 7 | กด "ลงเวลาเข้างาน" | แสดง dialog ยืนยัน | [ ] |
| 8 | ตรวจสอบ dialog message | "ยืนยันการลงเวลาเข้างาน ในสถานที่..." | [ ] |
| 9 | กด "ยืนยัน" | ส่งข้อมูลไป API | [ ] |
| 10 | เปิด Network Tab | POST /leave/check-in |
[ ] |
| 11 | ตรวจสอบ payload | { lat, lon, POI, isLocation: true, locationName: '', img, remark } | [ ] |
| 12 | ตรวจสอบ response | status = 200 | [ ] |
| 13 | ตรวจสอบ modal | แสดง modal ลงเวลาเข้างานสำเร็จ | [ ] |
| 14 | ตรวจสอบ statusCheckin | statusCheckin = false | [ ] |
Verification Checklist:
- API call ถูกต้อง
- Payload ถูกต้อง (isLocation: true, locationName: '')
- Response status 200
- แสดง modal สำเร็จ
statusCheckin = false
Test Case: TC-LOC-06-02 - ลงเวลาเข้าสำเร็จ - นอกสถานที่ตั้ง (Off-site)
Objective: ทดสอบการลงเวลาเข้าสำเร็จเมื่ออยู่นอกสถานที่ตั้ง
| Step | Action | Expected Result | Screenshot |
|---|---|---|---|
| 1 | เปิดแอป HRMS | แสดงหน้าแรก | [ ] |
| 2 | ตรวจสอบ statusCheckin | statusCheckin = true (เข้างาน) | [ ] |
| 3 | อนุญาต Location Permission | รับสิทธิ์สำเร็จ | [ ] |
| 4 | กดปุ่มขอตำแหน่ง | รับพิกัดสำเร็จ | [ ] |
| 5 | ถ่ายรูปภาพ | แสดงรูปที่ถ่าย | [ ] |
| 6 | เลือก "นอกสถานที่" | workplace = 'off-site' | [ ] |
| 7 | เลือก "ปฏิบัติงานที่บ้าน (WFH)" | model = 'ปฏิบัติงานที่บ้าน (WFH)' | [ ] |
| 8 | ตรวจสอบ useLocation | useLocation = 'ปฏิบัติงานที่บ้าน (WFH)' | [ ] |
| 9 | กด "ลงเวลาเข้างาน" | แสดง dialog ยืนยัน | [ ] |
| 10 | ตรวจสอบ dialog message | "ยืนยันการลงเวลาเข้างาน นอกสถานที่ (ปฏิบัติงานที่บ้าน (WFH))..." | [ ] |
| 11 | กด "ยืนยัน" | ส่งข้อมูลไป API | [ ] |
| 12 | เปิด Network Tab | POST /leave/check-in |
[ ] |
| 13 | ตรวจสอบ payload | { lat, lon, POI, isLocation: false, locationName: 'ปฏิบัติงานที่บ้าน (WFH)', img, remark } | [ ] |
| 14 | ตรวจสอบ response | status = 200 | [ ] |
Verification Checklist:
- API call ถูกต้อง
- Payload ถูกต้อง (isLocation: false, locationName มีค่า)
- Response status 200
- แสดง modal สำเร็จ
Test Case: TC-LOC-06-03 - ลงเวลาเข้าล้มเหลว - Mock Location detected
Objective: ทดสอบการลงเวลาเข้าล้มเหลวเมื่อตรวจพบ mock location
| Step | Action | Expected Result | Screenshot |
|---|---|---|---|
| 1 | เปิด Fake GPS Location App | เปิดแอป | [ ] |
| 2 | ตั้งค่าตำแหน่งปลอง | ตั้งค่าสำเร็จ | [ ] |
| 3 | เปิดแอป HRMS | แสดงหน้าแรก | [ ] |
| 4 | อนุญาต Location Permission | รับสิทธิ์สำเร็จ | [ ] |
| 5 | กดปุ่มขอตำแหน่ง | เริ่มรับพิกัด GPS | [ ] |
| 6 | รับพิกัดจาก Fake GPS | ตรวจจับ mock location | [ ] |
| 7 | ตรวจสอบ error message | "ตรวจพบว่าตำแหน่ง GPS อาจไม่ถูกต้อง..." | [ ] |
| 8 | ตรวจสอบ isMockLocationDetected | isMockLocationDetected = true | [ ] |
| 9 | ตรวจสอบ disabledBtn | disabledBtn = true | [ ] |
| 10 | ถ่ายรูปภาพ | แสดงรูปที่ถ่าย | [ ] |
| 11 | พยายามกด "ลงเวลาเข้างาน" | กดไม่ได้ (ปุ่ม disabled) | [ ] |
Verification Checklist:
- ตรวจจับ mock location สำเร็จ
isMockLocationDetected = truedisabledBtn = true- ไม่สามารถลงเวลาเข้างานได้
3.7 TC-LOC-07: Check-out with Location Testing
Test Case: TC-LOC-07-01 - ลงเวลาออกสำเร็จ
Objective: ทดสอบการลงเวลาออกสำเร็จพร้อมตำแหน่ง
| Step | Action | Expected Result | Screenshot |
|---|---|---|---|
| 1 | เปิดแอป HRMS | แสดงหน้าแรก | [ ] |
| 2 | ตรวจสอบ statusCheckin | statusCheckin = false (ออกงาน) | [ ] |
| 3 | อนุญาต Location Permission | รับสิทธิ์สำเร็จ | [ ] |
| 4 | กดปุ่มขอตำแหน่ง | รับพิกัดสำเร็จ | [ ] |
| 5 | ถ่ายรูปภาพ | แสดงรูปที่ถ่าย | [ ] |
| 6 | กด "ลงเวลาออกงาน" | เรียก checkoutCheck API | [ ] |
| 7 | เปิด Network Tab | GET /leave/user/checkout-check/N |
[ ] |
| 8 | ตรวจสอบ response | status = 'NORMAL' หรือ 'ABSENT' | [ ] |
| 9 | ตรวจสอบ dialog | แสดง dialog ยืนยันการลงเวลาออกงาน | [ ] |
| 10 | กด "ยืนยัน" | ส่งข้อมูลไป API | [ ] |
| 11 | เปิด Network Tab | POST /leave/check-in |
[ ] |
| 12 | ตรวจสอบ payload | { lat, lon, POI, isLocation, locationName, img, remark, checkInId } | [ ] |
| 13 | ตรวจสอบ response | status = 200 | [ ] |
| 14 | ตรวจสอบ modal | แสดง modal ลงเวลาออกงานสำเร็จ | [ ] |
| 15 | ตรวจสอบ statusCheckin | statusCheckin = true | [ ] |
Verification Checklist:
- checkoutCheck API ถูกต้อง
- API call ถูกต้อง (มี checkInId)
- Response status 200
- แสดง modal สำเร็จ
statusCheckin = true
3.8 TC-LOC-09: Privacy Consent Testing
Test Case: TC-LOC-09-01 - แสดง Privacy Modal ก่อนใช้ Location
Objective: ทดสอบการแสดง Privacy Modal ก่อนใช้ Location
| Step | Action | Expected Result | Screenshot |
|---|---|---|---|
| 1 | เปิดแอป HRMS ครั้งแรก (หรือ clear localStorage) | แสดงหน้าแรก | [ ] |
| 2 | ตรวจสอบ privacyStore.isAccepted | isAccepted = false | [ ] |
| 3 | กดปุ่มที่ต้องการ Location (แผนที่/กล้อง) | checkPrivacyAccepted() return false | [ ] |
| 4 | ตรวจสอบ privacyStore.modalPrivacy | modalPrivacy = true | [ ] |
| 5 | ตรวจสอบ Privacy Modal | แสดง Privacy Modal | [ ] |
| 6 | ตรวจสอบว่าไม่สามารถใช้งาน Location ได้ | แผนที่/กล้องไม่ทำงาน | [ ] |
Verification Checklist:
isAccepted = falsemodalPrivacy = true- แสดง Privacy Modal
- ไม่สามารถใช้งาน Location ได้
Test Case: TC-LOC-09-02 - ยอมรับ Privacy Policy
Objective: ทดสอบการยอมรับ Privacy Policy
| Step | Action | Expected Result | Screenshot |
|---|---|---|---|
| 1 | เปิดแอป HRMS ครั้งแรก | แสดงหน้าแรก | [ ] |
| 2 | แสดง Privacy Modal | แสดง Privacy Modal | [ ] |
| 3 | กด "ยอมรับ" | เรียก privacyStore.setAccepted(true) | [ ] |
| 4 | ตรวจสอบ privacyStore.isAccepted | isAccepted = true | [ ] |
| 5 | ตรวจสอบ privacyStore.modalPrivacy | modalPrivacy = false | [ ] |
| 6 | ตรวจสอบ Privacy Modal | Modal ปิด | [ ] |
| 7 | กดปุ่มขอตำแหน่ง | เรียก mapRef.value?.requestLocationPermission() | [ ] |
| 8 | อนุญาต Location Permission | รับสิทธิ์สำเร็จ | [ ] |
| 9 | รับพิกัดสำเร็จ | แสดงแผนที่ | [ ] |
Verification Checklist:
isAccepted = truemodalPrivacy = false- Modal ปิด
- สามารถใช้งาน Location ได้
Test Case: TC-LOC-09-03 - ปฏิเสธ Privacy Policy
Objective: ทดสอบการปฏิเสธ Privacy Policy
| Step | Action | Expected Result | Screenshot |
|---|---|---|---|
| 1 | เปิดแอป HRMS ครั้งแรก | แสดงหน้าแรก | [ ] |
| 2 | แสดง Privacy Modal | แสดง Privacy Modal | [ ] |
| 3 | กด "ปฏิเสธ" หรือปิด Modal | เรียก privacyStore.modalPrivacy = false | [ ] |
| 4 | ตรวจสอบ privacyStore.isAccepted | isAccepted = false | [ ] |
| 5 | ตรวจสอบ privacyStore.modalPrivacy | modalPrivacy = false | [ ] |
| 6 | ตรวจสอบ Privacy Modal | Modal ปิด | [ ] |
| 7 | กดปุ่มขอตำแหน่ง | checkPrivacyAccepted() return false | [ ] |
| 8 | ตรวจสอบ | Privacy Modal แสดงอีกครั้ง | [ ] |
Verification Checklist:
isAccepted = falsemodalPrivacy = false- Modal ปิด
- ไม่สามารถใช้งาน Location ได้
- แจ้งเตือนเมื่อพยายามใช้งาน Location
4. Mock Location Testing
4.1 Fake GPS Apps for Testing
4.1.1 Android Fake GPS Apps
| App Name | Link | Features |
|---|---|---|
| Fake GPS Location | Play Store | Simple location spoofing |
| GPS Joystick | Play Store | Joystick control, route simulation |
| Mock GPS | Play Store | Multiple location saving |
4.1.2 iOS Fake GPS Apps
| App Name | Link | Features |
|---|---|---|
| Location Changer | App Store | Location spoofing (needs jailbreak) |
| Xcode Simulation | - | Built-in location simulation |
4.2 Mock Location Test Scenarios
Scenario 1: Basic Mock Location
-
Setup
- เปิด Fake GPS Location App
- ตั้งค่าตำแหน่ง: 13.7563, 100.5018 (Sanam Suea Pa)
- ตั้งค่าความแม่นยำ: 10 meters
-
Execute
- เปิดแอป HRMS
- กดปุ่มขอตำแหน่ง
- ตรวจสอบผลลัพธ์
-
Expected
- ตรวจจับ mock location (indicators >= 3)
- แสดง error message
- ปุ่มลงเวลา disabled
Scenario 2: Rapid Location Change
-
Setup
- เปิดแอป HRMS ที่ตำแหน่ง A (13.7563, 100.5018)
- รอสักครู่เพื่อให้บันทึกตำแหน่ง A ลง history
-
Execute
- เปิด Fake GPS App
- เปลี่ยนตำแหน่งไป B (15.8700, 100.9925)
- รีเฟรชแอป HRMS ทันที (ภายใน 60 วินาที)
-
Expected
- คำนวณความเร็ว = ~3000 km/h (> 100 m/s)
- mockIndicators += 3
- แสดง error: "ตรวจพบการเคลื่อนที่ด้วยความเร็วผิดปกติ..."
Scenario 3: Null Island (0,0)
-
Setup
- เปิด Fake GPS App
- ตั้งค่าตำแหน่ง: 0, 0 (Null Island)
-
Execute
- เปิดแอป HRMS
- กดปุ่มขอตำแหน่ง
-
Expected
- validateCoordinates(0, 0) = false
- mockIndicators += 3
- แสดง error: "พิกัดตำแหน่งไม่ถูกต้อง กรุณาลองใหม่"
5. Developer Tools Testing
5.1 Chrome DevTools Sensor Simulation
5.1.1 Enable Sensors
- เปิด Chrome DevTools (F12)
- เลือก More tools > Sensors
- ตั้งค่า Location
5.1.2 Pre-defined Locations
| Location | Latitude | Longitude | Use Case |
|---|---|---|---|
| Sanam Suea Pa | 13.7563 | 100.5018 | Bangkok office |
| Suvarnabhumi Airport | 13.6900 | 100.7501 | Outdoor high accuracy |
| Central World | 13.7944 | 100.5439 | Indoor |
| Null Island | 0 | 0 | Invalid coordinates |
| Out of Range | 91 | 181 | Out of range test |
5.1.3 Custom Location
- เลือก "Other..." ใน Sensors tab
- ป้อน Latitude และ Longitude
- กด Enter
5.2 Network Throttling
5.2.1 Enable Throttling
- เปิด Chrome DevTools (F12)
- เลือก Network tab
- เลือก Throttling
- เลือก preset หรือ custom
5.2.2 Throttling Presets
| Preset | Download | Upload | Latency | Use Case |
|---|---|---|---|---|
| Offline | 0 | 0 | - | API failure test |
| Slow 3G | 500 Kbps | 500 Kbps | 2000ms | Slow network |
| Fast 3G | 1.6 Mbps | 750 Kbps | 100ms | Normal mobile |
5.3 Console Testing
5.3.1 Test Location Validation
// Test 1: Valid coordinates
const validPosition = {
coords: { latitude: 13.7563, longitude: 100.5018, accuracy: 10 },
timestamp: Date.now()
}
console.log(validateLocation(validPosition))
// Expected: { isValid: true, isMockDetected: false }
// Test 2: Invalid coordinates (0,0)
const invalidPosition = {
coords: { latitude: 0, longitude: 0, accuracy: 10 },
timestamp: Date.now()
}
console.log(validateLocation(invalidPosition))
// Expected: { isValid: false, isMockDetected: true, confidence: 'high' }
// Test 3: Stale timestamp
const stalePosition = {
coords: { latitude: 13.7563, longitude: 100.5018, accuracy: 10 },
timestamp: Date.now() - 70000 // 70 seconds ago
}
console.log(validateLocation(stalePosition))
// Expected: errors = ["ข้อมูลตำแหน่งเก่าเกินไป..."]
// Test 4: Poor accuracy
const poorAccuracyPosition = {
coords: { latitude: 13.7563, longitude: 100.5018, accuracy: 150 },
timestamp: Date.now()
}
console.log(validateLocation(poorAccuracyPosition))
// Expected: warnings = ["ความแม่นยำตำแหน่งต่ำเกินไป..."]
5.3.2 Test Distance Calculation
// Test haversineDistance
const distance = haversineDistance(13.7563, 100.5018, 15.8700, 100.9925)
console.log(`Distance: ${distance} meters`)
// Expected: ~180,000 meters (180 km)
// Test speed calculation
const pos1 = { latitude: 13.7563, longitude: 100.5018, timestamp: Date.now() - 60000 }
const pos2 = { latitude: 15.8700, longitude: 100.9925, timestamp: Date.now() }
const speed = calculateSpeed(pos1, pos2)
console.log(`Speed: ${speed} m/s (${speed * 3.6} km/h)`)
// Expected: ~3000 km/h (> 100 m/s = 360 km/h)
6. Device-Specific Testing
6.1 Mobile Device Testing
6.1.1 Android Testing
| Step | Action | Notes |
|---|---|---|
| 1 | Install Fake GPS App | Google Play Store |
| 2 | Enable Developer Options | Settings > About Phone > Build Number (7 taps) |
| 3 | Enable Mock Location | Settings > Developer Options > Select mock location app |
| 4 | Set Fake Location | Fake GPS App > Set Location |
| 5 | Open HRMS App | Test mock detection |
6.1.2 iOS Testing
| Step | Action | Notes |
|---|---|---|
| 1 | Connect iPhone to Mac | USB cable |
| 2 | Open Xcode | Mac |
| 3 | Select Device > Debug Location | Xcode menu |
| 4 | Set Custom Location | Enter lat/lon |
| 5 | Open HRMS App | Test mock detection |
6.2 Desktop Browser Testing
6.2.1 Chrome Testing
| Step | Action | Notes |
|---|---|---|
| 1 | Open Chrome | - |
| 2 | Open DevTools | F12 |
| 3 | More tools > Sensors | - |
| 4 | Set Location | Choose or custom |
| 5 | Open HRMS App | Test location |
6.2.2 Edge Testing
| Step | Action | Notes |
|---|---|---|
| 1 | Open Edge | - |
| 2 | Open DevTools | F12 |
| 3 | More tools > Sensors | - |
| 4 | Set Location | Choose or custom |
| 5 | Open HRMS App | Test location |
7. Test Data & Scenarios
7.1 Valid Locations
| Name | Latitude | Longitude | Accuracy | Expected |
|---|---|---|---|---|
| Sanam Suea Pa | 13.7563 | 100.5018 | <= 100m | Pass |
| Suvarnabhumi | 13.6900 | 100.7501 | <= 100m | Pass |
| Central World | 13.7944 | 100.5439 | <= 100m | Pass |
| Chiang Mai | 18.7883 | 98.9853 | <= 100m | Pass |
7.2 Invalid Locations
| Name | Latitude | Longitude | Accuracy | Expected |
|---|---|---|---|---|
| Null Island | 0 | 0 | Any | Fail (invalid coordinates) |
| Out of Range (lat) | 91 | 100.5018 | Any | Fail (invalid coordinates) |
| Out of Range (lon) | 13.7563 | 181 | Any | Fail (invalid coordinates) |
| NaN | NaN | NaN | Any | Fail (invalid coordinates) |
7.3 Edge Cases
| Scenario | Latitude | Longitude | Accuracy | Timestamp | Expected |
|---|---|---|---|---|---|
| Stale Data | 13.7563 | 100.5018 | 10 | t - 70s | Fail (stale) |
| Poor Accuracy | 13.7563 | 100.5018 | 150 | current | Warning |
| Impossible Speed | 15.8700 | 100.9925 | 10 | t + 60s (from 13.7563, 100.5018) | Fail (speed) |
8. Troubleshooting
8.1 Common Issues
| Issue | Cause | Solution |
|---|---|---|
| ไม่ได้รับพิกัด GPS | GPS ปิดอยู่ | เปิด Location Service |
| แผนที่ไม่แสดง | ยังไม่ยอมรับ Privacy Policy | ยอมรับ Privacy Policy |
| ปุ่มลงเวลา disabled | Mock location detected | ปิด Fake GPS App และรีเฟรช |
| POI ไม่แสดง | Bangkok GIS down | รอ fallback ไป ArcGIS |
| ความแม่นยำต่ำ | อยู่ในอาคาร | ไปยังพื้นที่เปิดกว้าง |
8.2 Debug Mode
Enable Debug Mode
- เปิด Console ใน Browser
- ตรวจสอบค่าต่าง ๆ:
// Check validation result
console.log('Validation:', validationResult)
// Check location granted
console.log('Location Granted:', locationGranted)
// Check mock detected
console.log('Mock Detected:', isMockLocationDetected)
// Check form location
console.log('Form Location:', formLocation)
// Check privacy accepted
console.log('Privacy Accepted:', privacyStore.isAccepted)
9. Test Execution Checklist
9.1 Pre-Test Checklist
- ติดตั้ง Fake GPS App (สำหรับการทดสอบ mock location)
- เปิด Developer Options (Android) หรือเตรียม Xcode (iOS)
- เตรียม Test Data และ Test Scenarios
- เตรียม Screenshot/Screen Recording tool
- ตรวจสอบ Test Environment (Network, GPS, etc.)
9.2 During Test Checklist
- บันทึกผลลัพธ์ทุก Test Case
- ถ่าย Screenshot สำคัญ
- บันทึกข้อผิดพลาดที่พบ
- ตรวจสอบ Console logs
- ตรวจสอบ Network requests
9.3 Post-Test Checklist
- สรุปผลการทดสอบ
- รายงาน bugs ที่พบ
- อัปเดต Test Cases document
- เตรียม Test Evidence (Screenshots, Videos)
- ส่งรายงานให้ทีมที่เกี่ยวข้อง
10. References
10.1 Related Documents
10.2 External Resources
11. Revision History
| Version | Date | Author | Changes |
|---|---|---|---|
| 1.0.0 | 2025-03-09 | QA Team | Initial version - Detailed test steps for Location features |
12. Approval
| Role | Name | Signature | Date |
|---|---|---|---|
| QA Lead | |||
| Developer | |||
| Product Owner |