171 lines
6.1 KiB
Markdown
171 lines
6.1 KiB
Markdown
# Load Testing Documentation for C Programming Learning Management System
|
|
|
|
## Overview
|
|
This document describes how to perform load testing on the C Programming Learning Management System to ensure it can handle at least 50 concurrent students accessing the application.
|
|
|
|
## Requirements
|
|
- Python 3.7+ (for local testing)
|
|
- Locust (installed via pip)
|
|
- Podman (for containerized testing)
|
|
- The LMS application running on your local machine or a test server
|
|
|
|
## Setup
|
|
|
|
### Option 1: Local Installation
|
|
#### 1. Install Locust
|
|
```bash
|
|
pip install locust
|
|
```
|
|
|
|
Alternatively, install from the requirements file in the test directory:
|
|
```bash
|
|
cd /path/to/lms-c/test
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
#### 2. Ensure the LMS Application is Running
|
|
Start your LMS application:
|
|
```bash
|
|
cd /path/to/lms-c
|
|
./start.sh
|
|
```
|
|
Or if running directly:
|
|
```bash
|
|
python app.py
|
|
```
|
|
|
|
By default, the application runs on `http://localhost:5000`.
|
|
|
|
### Option 2: Containerized Setup with Podman
|
|
The load testing can also be run in a containerized environment using Podman. This ensures consistency across different environments and simplifies setup.
|
|
|
|
#### 1. Using the provided podman-compose file
|
|
A podman-compose file is provided in the test directory that sets up both the LMS application and the load testing service:
|
|
|
|
```bash
|
|
cd /path/to/lms-c
|
|
podman-compose -f test/podman-compose.yml up --build
|
|
```
|
|
|
|
This will start both the LMS application and the Locust load testing service. The Locust web interface will be available at `http://localhost:8089`.
|
|
|
|
#### 2. Running only the load test container against an existing LMS
|
|
If you already have the LMS running, you can run just the load test container:
|
|
|
|
```bash
|
|
cd /path/to/lms-c
|
|
podman build -f test/Dockerfile -t lms-c-load-test .
|
|
podman run -p 8089:8089 --network=host lms-c-load-test
|
|
```
|
|
|
|
Note: Using `--network=host` allows the container to access the LMS running on localhost.
|
|
|
|
## Running the Load Test
|
|
|
|
### Local Load Test
|
|
#### Basic Load Test
|
|
To run a load test simulating 50 users with a hatch rate of 2 users per second:
|
|
```bash
|
|
cd /path/to/lms-c/test
|
|
locust -f load_test.py --host=http://localhost:5000
|
|
```
|
|
|
|
Then open your browser and go to `http://localhost:8089` to configure the load test.
|
|
|
|
#### Command Line Load Test
|
|
To run the load test directly from the command line without the web interface:
|
|
```bash
|
|
locust -f load_test.py --host=http://localhost:5000 --users=50 --spawn-rate=2 --run-time=5m --headless
|
|
```
|
|
|
|
This command will:
|
|
- Simulate 50 users (`--users=50`)
|
|
- Spawn 2 users per second (`--spawn-rate=2`)
|
|
- Run for 5 minutes (`--run-time=5m`)
|
|
- Run in headless mode without the web interface (`--headless`)
|
|
|
|
### Containerized Load Test
|
|
#### Using Podman Compose
|
|
To run both the LMS and load testing services together:
|
|
```bash
|
|
cd /path/to/lms-c
|
|
podman-compose -f test/podman-compose.yml up --build
|
|
```
|
|
|
|
Then access the Locust web interface at `http://localhost:8089` to configure and start the load test.
|
|
|
|
#### Running Load Test Only
|
|
To run just the load test against an existing LMS service:
|
|
```bash
|
|
cd /path/to/lms-c
|
|
podman build -f test/Dockerfile -t lms-c-load-test .
|
|
podman run -p 8089:8089 --network=host lms-c-load-test
|
|
```
|
|
|
|
#### Command Line Load Test in Container
|
|
To run the load test directly from the command line in headless mode:
|
|
```bash
|
|
cd /path/to/lms-c
|
|
podman build -f test/Dockerfile -t lms-c-load-test .
|
|
podman run --network=host lms-c-load-test locust -f /app/test/load_test.py --host=http://localhost:5000 --users=50 --spawn-rate=2 --run-time=5m --headless
|
|
```
|
|
|
|
## Test Scenarios
|
|
|
|
The load test script simulates the following student behaviors:
|
|
|
|
1. **Viewing the homepage** (30% of requests) - Students browsing available lessons
|
|
2. **Viewing lesson pages** (40% of requests) - Students reading lesson content
|
|
3. **Compiling code** (20% of requests) - Students submitting C code for compilation
|
|
4. **Logging in** (10% of requests) - Students authenticating with tokens
|
|
5. **Validating tokens** (10% of requests) - Students validating their access tokens
|
|
6. **Tracking progress** (10% of requests) - Students saving their lesson progress
|
|
|
|
## Monitoring and Metrics
|
|
|
|
During the load test, Locust provides the following metrics:
|
|
|
|
- **Users**: Number of concurrent users
|
|
- **Failures**: Number of failed requests
|
|
- **Requests per second**: Average request rate
|
|
- **Average response time**: Mean response time across all requests
|
|
- **95th percentile response time**: Response time below which 95% of requests complete
|
|
- **99th percentile response time**: Response time below which 99% of requests complete
|
|
- **Total requests**: Total number of requests made during the test
|
|
|
|
## Performance Benchmarks
|
|
|
|
For the application to be considered capable of handling 50 students simultaneously, it should meet these benchmarks:
|
|
|
|
- Less than 1% failure rate
|
|
- Average response time under 2 seconds
|
|
- 95th percentile response time under 5 seconds
|
|
- No significant degradation in performance as user count increases
|
|
|
|
## Customizing the Load Test
|
|
|
|
You can modify the `load_test.py` file to adjust:
|
|
|
|
- The number of users simulated
|
|
- The distribution of different types of requests
|
|
- The wait time between requests
|
|
- The sample code used for compilation tests
|
|
- The tokens used for authentication
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues:
|
|
|
|
1. **Connection Refused**: Ensure the LMS application is running on the specified host/port
|
|
2. **High Failure Rate**: Check application logs for errors during the load test
|
|
3. **Memory Issues**: Monitor system resources during the test
|
|
4. **GCC Compilation Errors**: The application compiles C code, which may consume resources
|
|
|
|
### Resource Monitoring:
|
|
Consider monitoring system resources (CPU, memory, disk I/O) during the test using tools like `htop`, `iostat`, or `vmstat`.
|
|
|
|
## Conclusion
|
|
|
|
This load testing setup allows you to verify that the C Programming Learning Management System can handle at least 50 concurrent students. Regular load testing should be performed, especially after major updates, to ensure the application continues to meet performance requirements.
|
|
|
|
Both local and containerized options are available to suit different deployment scenarios. The containerized approach using Podman ensures consistency across different environments and simplifies the setup process. |