Repository files navigation

🤖 TestAgent - Automated UI Testing for GitHub

CI/CD PipelineSecurity Scancodecov

TestAgent automatically generates and runs UI tests for your web applications using AI. Simply add it to your GitHub repository and it will test your UI on every pull request!

🚀 Quick Start for GitHub Actions

1. Create Your Test Configuration

Use the TestAgent frontend to generate your test configuration:

🎨 Open TestAgent Configurator

  1. Define your application's pages (Login, Dashboard, etc.)
  2. Configure test preferences for each page
  3. Set up page dependencies and login credentials
  4. Download the generated config.yml file

2. Add Configuration to Your Repository

Save the generated config.yml file to your repository root or .github/ directory.

3. Add TestAgent GitHub Action

Create .github/workflows/testagent.yml in your repository:

name: TestAgent UI Testingon:
pull_request:
branches: [ main, master, develop ]jobs:
ui-tests:
runs-on: ubuntu-latestname: Automated UI Testingsteps:
- name: Checkout repositoryuses: actions/checkout@v4
- name: Run TestAgentuses: abalakrishnan1/testagent@mainwith:
url: 'https://your-app-url.com'# Replace with your app URLconfig-file: 'config.yml'# Path to your config filegoogle-api-key: ${{ secrets.GOOGLE_API_KEY }}comment-on-pr: 'true'

4. Add API Key to Repository Secrets

  1. Go to your repository → Settings → Secrets and variables → Actions
  2. Click "New repository secret"
  3. Name: GOOGLE_API_KEY
  4. Value: Your Google Gemini API key (Get one here)

5. That's it! 🎉

TestAgent will now run on every pull request and:

  • 🔍 Use your configuration to test specific pages and workflows
  • 🧪 Generate intelligent test cases based on your UI structure
  • 🤖 Execute tests automatically with proper page dependencies
  • 🏃‍♂️ Execute tests in a real browser
  • 📊 Save test results, screenshots, and detailed reports as GitHub Action artifacts

🎨 Configuration Made Easy

🔗 Open TestAgent Configurator

Our visual configurator makes it easy to set up your tests:

  • Page Definition: Define your app's pages (Login, Dashboard, Profile, etc.)
  • Test Preferences: Configure what to test on each page (buttons, forms, links)
  • Page Dependencies: Set up realistic user flows (login → dashboard → profile)
  • Login Credentials: Configure both success and failure scenarios
  • Selector Targeting: Specify which elements to prioritize for testing
  • Fuzzing Options: Enable input fuzzing for form-heavy pages

The configurator generates a simple YAML file that TestAgent uses to run your tests.

🛠️ Local Development

git clone https://github.com/abalakrishnan1/testagent.git
cd testagent
# Set up development environment
make setup
# Configure your API key
cp .env.example .env
# Edit .env and add your GOOGLE_API_KEY

🚦 Usage

With Configuration File

# Create config using the frontend, then run:
python main.py --config config.yml --url https://your-app.com
# Or test a specific URL without config
python main.py --url https://www.saucedemo.com/
# Use with make for convenience
make run
# Run with Docker
make docker-run

Command Line Options

python main.py [OPTIONS]
Options:
--config PATH Path to configuration YAML file generated by frontend
--url URL URL to test --browser BROWSER Browser to use (chromium, firefox, webkit)
--headless BOOL Run in headless mode (true/false)
--timeout INT Test timeout in seconds
--max-tests INT Maximum number of tests to generate
--output-format STR Output format (console, github-action)

Configuration File Format

While the TestAgent Configurator is the recommended way to create configuration files, here's the expected YAML structure:

# config.ymlLogin:
Buttons: true # Test button interactionsLinks: false # Skip link testing Input_fields: true # Test input fieldspage_fuzzing: false # Skip fuzzing testsselectors: # CSS selectors to prioritize
- "#username"
- "#password"
- "#login-btn"depends_on: [] # Page dependenciesError: # Login failure credentialsUsername: "invalid@example.com"Password: "wrongpassword"Success: # Login success credentials Username: "test@example.com"Password: "validpassword"Dashboard:
Buttons: trueLinks: trueInput_fields: truepage_fuzzing: falseselectors:
- "#navigation"
- ".action-button"depends_on: ["Login"] # Must login first

See config.example.yml for a complete example.


### Advanced Usage
```bash
# Run with performance monitoring
make perf-test
# Run full CI pipeline locally
make ci
# Run specific test types
make test-unit # Unit tests only
make test-integration # Integration tests only
# Code quality checks
make lint # Run linting
make format # Format code
make security # Security scan

🏗 How it works

  1. UI Capture (ui_state.py): Captures your app's HTML and takes screenshots
  2. Test Planning (planner.py): Uses Gemini with few-shot examples to generate intelligent test cases
  3. Test Execution (execute.py): Runs Playwright tests with detailed reporting
  4. Result Analysis: Saves screenshots, logs, and generates comprehensive reports

📁 Project Structure

testagent/
├── main.py # Entry point and orchestration
├── containers.py # Container management for test apps
├── ui_state.py # UI capture and screenshot functionality
├── planner.py # LLM-powered test plan generation
├── execute.py # Playwright test execution engine
├── few_shot_examples.py # Prompt engineering examples
├── requirements.txt # Production dependencies
├── requirements-dev.txt # Development dependencies
├── Dockerfile # Multi-stage Docker build
├── docker-compose.yml # Container orchestration
├── Makefile # Development automation
├── pyproject.toml # Python project configuration
├── .github/workflows/ # CI/CD pipelines
│ ├── ci.yml # Main CI/CD pipeline
│ ├── scheduled.yml # Scheduled testing
│ └── dependencies.yml # Dependency updates
├── tests/ # Comprehensive test suite
├── frontend/ # React frontend (configuration UI)
└── results/ # Test outputs and screenshots

🧪 Testing

Running Tests

# Run all tests
make test# Run specific test categories
pytest tests/test_ui_state.py -v # UI capture tests
pytest tests/test_planner.py -v # Test planning tests
pytest tests/test_execute.py -v # Execution tests
pytest tests/test_integration.py -v # End-to-end tests# Run with coverage
make test-unit

Test Categories

  • Unit Tests: Individual component testing
  • Integration Tests: Full workflow testing
  • Security Tests: Vulnerability scanning
  • Performance Tests: Memory and execution profiling

🚀 CI/CD Pipeline

The project includes comprehensive GitHub Actions workflows:

Main CI Pipeline (.github/workflows/ci.yml)

  • ✅ Python code testing and linting
  • ✅ Frontend testing and building
  • ✅ Integration testing
  • ✅ Security vulnerability scanning
  • ✅ Automated deployment to staging/production

Scheduled Testing (.github/workflows/scheduled.yml)

  • 🕐 Daily test runs against multiple demo sites
  • 📊 Performance monitoring
  • 🔔 Slack notifications for failures

Dependency Management (.github/workflows/dependencies.yml)

  • 📦 Weekly dependency updates
  • 🛡️ Security vulnerability checks
  • 🔄 Automated pull requests for updates

📊 Example Output

✅ Running test agent on https://www.saucedemo.com/
✅ UI captured
Got test plan from LLM
Generated tests:
{
"description": "SauceDemo login page tests",
"tests": [
{
"description": "Test successful login with valid credentials",
"steps": [
{"action": "type", "selector": "#user-name", "value": "standard_user"},
{"action": "type", "selector": "#password", "value": "secret_sauce"},
{"action": "click", "selector": "#login-button"}
],
"expect": {
"url": "/inventory.html"
}
},
{
"description": "Test navigation to product page",
"steps": [
{"action": "click", "selector": ".inventory_item_name"}
],
"expect": {
"selectorVisible": ".inventory_details"
}
}
]
}
▶ Running: Test successful login with valid credentials
✅ Passed
▶ Running: Test navigation to product page ✅ Passed
All tests executed successfully

🎯 Roadmap

Current Focus

  • ✅ CI/CD Integration
  • ✅ Comprehensive testing suite
  • ✅ Security scanning
  • ✅ Docker containerization

Upcoming Features

  • 🔄 Config YAML Integration: Standardized test case definitions
  • 🎯 Base Case Coverage: Ensure consistent test coverage
  • 🔄 Retry Logic: JSON parsing with LangChain retries
  • 🌐 Multi-page Testing: Complex user journey support
  • 🎲 Advanced Fuzzing: Input validation and edge case testing
  • 📊 Test Coverage Validation: Post-prompt processing
  • 🔍 Visual Regression Testing: Screenshot comparison
  • 📈 Performance Benchmarking: Load and stress testing

🤝 Contributing

Development Setup

# Clone and setup
git clone https://github.com/abalakrishnan1/testagent.git
cd testagent
make setup
# Make changes and test
make ci
# Submit pull request

Code Quality Standards

  • Code Formatting: Black + isort
  • Linting: flake8
  • Security: Bandit scanning
  • Testing: pytest with >90% coverage
  • Documentation: Comprehensive docstrings

Pre-commit Hooks

# Setup pre-commit hooks
make setup-hooks
# Manual run
pre-commit run --all-files

📄 License

MIT License - see LICENSE file for details.

🙏 Acknowledgments

About

Automated test generation and execution

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

🤖 TestAgent - Automated UI Testing for GitHub

CI/CD PipelineSecurity Scancodecov

TestAgent automatically generates and runs UI tests for your web applications using AI. Simply add it to your GitHub repository and it will test your UI on every pull request!

🚀 Quick Start for GitHub Actions

1. Create Your Test Configuration

Use the TestAgent frontend to generate your test configuration:

🎨 Open TestAgent Configurator

  1. Define your application's pages (Login, Dashboard, etc.)
  2. Configure test preferences for each page
  3. Set up page dependencies and login credentials
  4. Download the generated config.yml file

2. Add Configuration to Your Repository

Save the generated config.yml file to your repository root or .github/ directory.

3. Add TestAgent GitHub Action

Create .github/workflows/testagent.yml in your repository:

name: TestAgent UI Testingon:
pull_request:
branches: [ main, master, develop ]jobs:
ui-tests:
runs-on: ubuntu-latestname: Automated UI Testingsteps:
- name: Checkout repositoryuses: actions/checkout@v4
- name: Run TestAgentuses: abalakrishnan1/testagent@mainwith:
url: 'https://your-app-url.com'# Replace with your app URLconfig-file: 'config.yml'# Path to your config filegoogle-api-key: ${{ secrets.GOOGLE_API_KEY }}comment-on-pr: 'true'

4. Add API Key to Repository Secrets

  1. Go to your repository → Settings → Secrets and variables → Actions
  2. Click "New repository secret"
  3. Name: GOOGLE_API_KEY
  4. Value: Your Google Gemini API key (Get one here)

5. That's it! 🎉

TestAgent will now run on every pull request and:

  • 🔍 Use your configuration to test specific pages and workflows
  • 🧪 Generate intelligent test cases based on your UI structure
  • 🤖 Execute tests automatically with proper page dependencies
  • 🏃‍♂️ Execute tests in a real browser
  • 📊 Save test results, screenshots, and detailed reports as GitHub Action artifacts

🎨 Configuration Made Easy

🔗 Open TestAgent Configurator

Our visual configurator makes it easy to set up your tests:

  • Page Definition: Define your app's pages (Login, Dashboard, Profile, etc.)
  • Test Preferences: Configure what to test on each page (buttons, forms, links)
  • Page Dependencies: Set up realistic user flows (login → dashboard → profile)
  • Login Credentials: Configure both success and failure scenarios
  • Selector Targeting: Specify which elements to prioritize for testing
  • Fuzzing Options: Enable input fuzzing for form-heavy pages

The configurator generates a simple YAML file that TestAgent uses to run your tests.

🛠️ Local Development

git clone https://github.com/abalakrishnan1/testagent.git
cd testagent
# Set up development environment
make setup
# Configure your API key
cp .env.example .env
# Edit .env and add your GOOGLE_API_KEY

🚦 Usage

With Configuration File

# Create config using the frontend, then run:
python main.py --config config.yml --url https://your-app.com
# Or test a specific URL without config
python main.py --url https://www.saucedemo.com/
# Use with make for convenience
make run
# Run with Docker
make docker-run

Command Line Options

python main.py [OPTIONS]
Options:
--config PATH Path to configuration YAML file generated by frontend
--url URL URL to test --browser BROWSER Browser to use (chromium, firefox, webkit)
--headless BOOL Run in headless mode (true/false)
--timeout INT Test timeout in seconds
--max-tests INT Maximum number of tests to generate
--output-format STR Output format (console, github-action)

Configuration File Format

While the TestAgent Configurator is the recommended way to create configuration files, here's the expected YAML structure:

# config.ymlLogin:
Buttons: true # Test button interactionsLinks: false # Skip link testing Input_fields: true # Test input fieldspage_fuzzing: false # Skip fuzzing testsselectors: # CSS selectors to prioritize
- "#username"
- "#password"
- "#login-btn"depends_on: [] # Page dependenciesError: # Login failure credentialsUsername: "invalid@example.com"Password: "wrongpassword"Success: # Login success credentials Username: "test@example.com"Password: "validpassword"Dashboard:
Buttons: trueLinks: trueInput_fields: truepage_fuzzing: falseselectors:
- "#navigation"
- ".action-button"depends_on: ["Login"] # Must login first

See config.example.yml for a complete example.


### Advanced Usage
```bash
# Run with performance monitoring
make perf-test
# Run full CI pipeline locally
make ci
# Run specific test types
make test-unit # Unit tests only
make test-integration # Integration tests only
# Code quality checks
make lint # Run linting
make format # Format code
make security # Security scan

🏗 How it works

  1. UI Capture (ui_state.py): Captures your app's HTML and takes screenshots
  2. Test Planning (planner.py): Uses Gemini with few-shot examples to generate intelligent test cases
  3. Test Execution (execute.py): Runs Playwright tests with detailed reporting
  4. Result Analysis: Saves screenshots, logs, and generates comprehensive reports

📁 Project Structure

testagent/
├── main.py # Entry point and orchestration
├── containers.py # Container management for test apps
├── ui_state.py # UI capture and screenshot functionality
├── planner.py # LLM-powered test plan generation
├── execute.py # Playwright test execution engine
├── few_shot_examples.py # Prompt engineering examples
├── requirements.txt # Production dependencies
├── requirements-dev.txt # Development dependencies
├── Dockerfile # Multi-stage Docker build
├── docker-compose.yml # Container orchestration
├── Makefile # Development automation
├── pyproject.toml # Python project configuration
├── .github/workflows/ # CI/CD pipelines
│ ├── ci.yml # Main CI/CD pipeline
│ ├── scheduled.yml # Scheduled testing
│ └── dependencies.yml # Dependency updates
├── tests/ # Comprehensive test suite
├── frontend/ # React frontend (configuration UI)
└── results/ # Test outputs and screenshots

🧪 Testing

Running Tests

# Run all tests
make test# Run specific test categories
pytest tests/test_ui_state.py -v # UI capture tests
pytest tests/test_planner.py -v # Test planning tests
pytest tests/test_execute.py -v # Execution tests
pytest tests/test_integration.py -v # End-to-end tests# Run with coverage
make test-unit

Test Categories

  • Unit Tests: Individual component testing
  • Integration Tests: Full workflow testing
  • Security Tests: Vulnerability scanning
  • Performance Tests: Memory and execution profiling

🚀 CI/CD Pipeline

The project includes comprehensive GitHub Actions workflows:

Main CI Pipeline (.github/workflows/ci.yml)

  • ✅ Python code testing and linting
  • ✅ Frontend testing and building
  • ✅ Integration testing
  • ✅ Security vulnerability scanning
  • ✅ Automated deployment to staging/production

Scheduled Testing (.github/workflows/scheduled.yml)

  • 🕐 Daily test runs against multiple demo sites
  • 📊 Performance monitoring
  • 🔔 Slack notifications for failures

Dependency Management (.github/workflows/dependencies.yml)

  • 📦 Weekly dependency updates
  • 🛡️ Security vulnerability checks
  • 🔄 Automated pull requests for updates

📊 Example Output

✅ Running test agent on https://www.saucedemo.com/
✅ UI captured
Got test plan from LLM
Generated tests:
{
"description": "SauceDemo login page tests",
"tests": [
{
"description": "Test successful login with valid credentials",
"steps": [
{"action": "type", "selector": "#user-name", "value": "standard_user"},
{"action": "type", "selector": "#password", "value": "secret_sauce"},
{"action": "click", "selector": "#login-button"}
],
"expect": {
"url": "/inventory.html"
}
},
{
"description": "Test navigation to product page",
"steps": [
{"action": "click", "selector": ".inventory_item_name"}
],
"expect": {
"selectorVisible": ".inventory_details"
}
}
]
}
▶ Running: Test successful login with valid credentials
✅ Passed
▶ Running: Test navigation to product page ✅ Passed
All tests executed successfully

🎯 Roadmap

Current Focus

  • ✅ CI/CD Integration
  • ✅ Comprehensive testing suite
  • ✅ Security scanning
  • ✅ Docker containerization

Upcoming Features

  • 🔄 Config YAML Integration: Standardized test case definitions
  • 🎯 Base Case Coverage: Ensure consistent test coverage
  • 🔄 Retry Logic: JSON parsing with LangChain retries
  • 🌐 Multi-page Testing: Complex user journey support
  • 🎲 Advanced Fuzzing: Input validation and edge case testing
  • 📊 Test Coverage Validation: Post-prompt processing
  • 🔍 Visual Regression Testing: Screenshot comparison
  • 📈 Performance Benchmarking: Load and stress testing

🤝 Contributing

Development Setup

# Clone and setup
git clone https://github.com/abalakrishnan1/testagent.git
cd testagent
make setup
# Make changes and test
make ci
# Submit pull request

Code Quality Standards

  • Code Formatting: Black + isort
  • Linting: flake8
  • Security: Bandit scanning
  • Testing: pytest with >90% coverage
  • Documentation: Comprehensive docstrings

Pre-commit Hooks

# Setup pre-commit hooks
make setup-hooks
# Manual run
pre-commit run --all-files

📄 License

MIT License - see LICENSE file for details.

🙏 Acknowledgments

About

Automated test generation and execution

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

🤖 TestAgent - Automated UI Testing for GitHub

CI/CD PipelineSecurity Scancodecov

TestAgent automatically generates and runs UI tests for your web applications using AI. Simply add it to your GitHub repository and it will test your UI on every pull request!

🚀 Quick Start for GitHub Actions

1. Create Your Test Configuration

Use the TestAgent frontend to generate your test configuration:

🎨 Open TestAgent Configurator

  1. Define your application's pages (Login, Dashboard, etc.)
  2. Configure test preferences for each page
  3. Set up page dependencies and login credentials
  4. Download the generated config.yml file

2. Add Configuration to Your Repository

Save the generated config.yml file to your repository root or .github/ directory.

3. Add TestAgent GitHub Action

Create .github/workflows/testagent.yml in your repository:

name: TestAgent UI Testingon:
pull_request:
branches: [ main, master, develop ]jobs:
ui-tests:
runs-on: ubuntu-latestname: Automated UI Testingsteps:
- name: Checkout repositoryuses: actions/checkout@v4
- name: Run TestAgentuses: abalakrishnan1/testagent@mainwith:
url: 'https://your-app-url.com'# Replace with your app URLconfig-file: 'config.yml'# Path to your config filegoogle-api-key: ${{ secrets.GOOGLE_API_KEY }}comment-on-pr: 'true'

4. Add API Key to Repository Secrets

  1. Go to your repository → Settings → Secrets and variables → Actions
  2. Click "New repository secret"
  3. Name: GOOGLE_API_KEY
  4. Value: Your Google Gemini API key (Get one here)

5. That's it! 🎉

TestAgent will now run on every pull request and:

  • 🔍 Use your configuration to test specific pages and workflows
  • 🧪 Generate intelligent test cases based on your UI structure
  • 🤖 Execute tests automatically with proper page dependencies
  • 🏃‍♂️ Execute tests in a real browser
  • 📊 Save test results, screenshots, and detailed reports as GitHub Action artifacts

🎨 Configuration Made Easy

🔗 Open TestAgent Configurator

Our visual configurator makes it easy to set up your tests:

  • Page Definition: Define your app's pages (Login, Dashboard, Profile, etc.)
  • Test Preferences: Configure what to test on each page (buttons, forms, links)
  • Page Dependencies: Set up realistic user flows (login → dashboard → profile)
  • Login Credentials: Configure both success and failure scenarios
  • Selector Targeting: Specify which elements to prioritize for testing
  • Fuzzing Options: Enable input fuzzing for form-heavy pages

The configurator generates a simple YAML file that TestAgent uses to run your tests.

🛠️ Local Development

git clone https://github.com/abalakrishnan1/testagent.git
cd testagent
# Set up development environment
make setup
# Configure your API key
cp .env.example .env
# Edit .env and add your GOOGLE_API_KEY

🚦 Usage

With Configuration File

# Create config using the frontend, then run:
python main.py --config config.yml --url https://your-app.com
# Or test a specific URL without config
python main.py --url https://www.saucedemo.com/
# Use with make for convenience
make run
# Run with Docker
make docker-run

Command Line Options

python main.py [OPTIONS]
Options:
--config PATH Path to configuration YAML file generated by frontend
--url URL URL to test --browser BROWSER Browser to use (chromium, firefox, webkit)
--headless BOOL Run in headless mode (true/false)
--timeout INT Test timeout in seconds
--max-tests INT Maximum number of tests to generate
--output-format STR Output format (console, github-action)

Configuration File Format

While the TestAgent Configurator is the recommended way to create configuration files, here's the expected YAML structure:

# config.ymlLogin:
Buttons: true # Test button interactionsLinks: false # Skip link testing Input_fields: true # Test input fieldspage_fuzzing: false # Skip fuzzing testsselectors: # CSS selectors to prioritize
- "#username"
- "#password"
- "#login-btn"depends_on: [] # Page dependenciesError: # Login failure credentialsUsername: "invalid@example.com"Password: "wrongpassword"Success: # Login success credentials Username: "test@example.com"Password: "validpassword"Dashboard:
Buttons: trueLinks: trueInput_fields: truepage_fuzzing: falseselectors:
- "#navigation"
- ".action-button"depends_on: ["Login"] # Must login first

See config.example.yml for a complete example.


### Advanced Usage
```bash
# Run with performance monitoring
make perf-test
# Run full CI pipeline locally
make ci
# Run specific test types
make test-unit # Unit tests only
make test-integration # Integration tests only
# Code quality checks
make lint # Run linting
make format # Format code
make security # Security scan

🏗 How it works

  1. UI Capture (ui_state.py): Captures your app's HTML and takes screenshots
  2. Test Planning (planner.py): Uses Gemini with few-shot examples to generate intelligent test cases
  3. Test Execution (execute.py): Runs Playwright tests with detailed reporting
  4. Result Analysis: Saves screenshots, logs, and generates comprehensive reports

📁 Project Structure

testagent/
├── main.py # Entry point and orchestration
├── containers.py # Container management for test apps
├── ui_state.py # UI capture and screenshot functionality
├── planner.py # LLM-powered test plan generation
├── execute.py # Playwright test execution engine
├── few_shot_examples.py # Prompt engineering examples
├── requirements.txt # Production dependencies
├── requirements-dev.txt # Development dependencies
├── Dockerfile # Multi-stage Docker build
├── docker-compose.yml # Container orchestration
├── Makefile # Development automation
├── pyproject.toml # Python project configuration
├── .github/workflows/ # CI/CD pipelines
│ ├── ci.yml # Main CI/CD pipeline
│ ├── scheduled.yml # Scheduled testing
│ └── dependencies.yml # Dependency updates
├── tests/ # Comprehensive test suite
├── frontend/ # React frontend (configuration UI)
└── results/ # Test outputs and screenshots

🧪 Testing

Running Tests

# Run all tests
make test# Run specific test categories
pytest tests/test_ui_state.py -v # UI capture tests
pytest tests/test_planner.py -v # Test planning tests
pytest tests/test_execute.py -v # Execution tests
pytest tests/test_integration.py -v # End-to-end tests# Run with coverage
make test-unit

Test Categories

  • Unit Tests: Individual component testing
  • Integration Tests: Full workflow testing
  • Security Tests: Vulnerability scanning
  • Performance Tests: Memory and execution profiling

🚀 CI/CD Pipeline

The project includes comprehensive GitHub Actions workflows:

Main CI Pipeline (.github/workflows/ci.yml)

  • ✅ Python code testing and linting
  • ✅ Frontend testing and building
  • ✅ Integration testing
  • ✅ Security vulnerability scanning
  • ✅ Automated deployment to staging/production

Scheduled Testing (.github/workflows/scheduled.yml)

  • 🕐 Daily test runs against multiple demo sites
  • 📊 Performance monitoring
  • 🔔 Slack notifications for failures

Dependency Management (.github/workflows/dependencies.yml)

  • 📦 Weekly dependency updates
  • 🛡️ Security vulnerability checks
  • 🔄 Automated pull requests for updates

📊 Example Output

✅ Running test agent on https://www.saucedemo.com/
✅ UI captured
Got test plan from LLM
Generated tests:
{
"description": "SauceDemo login page tests",
"tests": [
{
"description": "Test successful login with valid credentials",
"steps": [
{"action": "type", "selector": "#user-name", "value": "standard_user"},
{"action": "type", "selector": "#password", "value": "secret_sauce"},
{"action": "click", "selector": "#login-button"}
],
"expect": {
"url": "/inventory.html"
}
},
{
"description": "Test navigation to product page",
"steps": [
{"action": "click", "selector": ".inventory_item_name"}
],
"expect": {
"selectorVisible": ".inventory_details"
}
}
]
}
▶ Running: Test successful login with valid credentials
✅ Passed
▶ Running: Test navigation to product page ✅ Passed
All tests executed successfully

🎯 Roadmap

Current Focus

  • ✅ CI/CD Integration
  • ✅ Comprehensive testing suite
  • ✅ Security scanning
  • ✅ Docker containerization

Upcoming Features

  • 🔄 Config YAML Integration: Standardized test case definitions
  • 🎯 Base Case Coverage: Ensure consistent test coverage
  • 🔄 Retry Logic: JSON parsing with LangChain retries
  • 🌐 Multi-page Testing: Complex user journey support
  • 🎲 Advanced Fuzzing: Input validation and edge case testing
  • 📊 Test Coverage Validation: Post-prompt processing
  • 🔍 Visual Regression Testing: Screenshot comparison
  • 📈 Performance Benchmarking: Load and stress testing

🤝 Contributing

Development Setup

# Clone and setup
git clone https://github.com/abalakrishnan1/testagent.git
cd testagent
make setup
# Make changes and test
make ci
# Submit pull request

Code Quality Standards

  • Code Formatting: Black + isort
  • Linting: flake8
  • Security: Bandit scanning
  • Testing: pytest with >90% coverage
  • Documentation: Comprehensive docstrings

Pre-commit Hooks

# Setup pre-commit hooks
make setup-hooks
# Manual run
pre-commit run --all-files

📄 License

MIT License - see LICENSE file for details.

🙏 Acknowledgments

About

Automated test generation and execution

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

🤖 TestAgent - Automated UI Testing for GitHub

CI/CD PipelineSecurity Scancodecov

TestAgent automatically generates and runs UI tests for your web applications using AI. Simply add it to your GitHub repository and it will test your UI on every pull request!

🚀 Quick Start for GitHub Actions

1. Create Your Test Configuration

Use the TestAgent frontend to generate your test configuration:

🎨 Open TestAgent Configurator

  1. Define your application's pages (Login, Dashboard, etc.)
  2. Configure test preferences for each page
  3. Set up page dependencies and login credentials
  4. Download the generated config.yml file

2. Add Configuration to Your Repository

Save the generated config.yml file to your repository root or .github/ directory.

3. Add TestAgent GitHub Action

Create .github/workflows/testagent.yml in your repository:

name: TestAgent UI Testingon:
pull_request:
branches: [ main, master, develop ]jobs:
ui-tests:
runs-on: ubuntu-latestname: Automated UI Testingsteps:
- name: Checkout repositoryuses: actions/checkout@v4
- name: Run TestAgentuses: abalakrishnan1/testagent@mainwith:
url: 'https://your-app-url.com'# Replace with your app URLconfig-file: 'config.yml'# Path to your config filegoogle-api-key: ${{ secrets.GOOGLE_API_KEY }}comment-on-pr: 'true'

4. Add API Key to Repository Secrets

  1. Go to your repository → Settings → Secrets and variables → Actions
  2. Click "New repository secret"
  3. Name: GOOGLE_API_KEY
  4. Value: Your Google Gemini API key (Get one here)

5. That's it! 🎉

TestAgent will now run on every pull request and:

  • 🔍 Use your configuration to test specific pages and workflows
  • 🧪 Generate intelligent test cases based on your UI structure
  • 🤖 Execute tests automatically with proper page dependencies
  • 🏃‍♂️ Execute tests in a real browser
  • 📊 Save test results, screenshots, and detailed reports as GitHub Action artifacts

🎨 Configuration Made Easy

🔗 Open TestAgent Configurator

Our visual configurator makes it easy to set up your tests:

  • Page Definition: Define your app's pages (Login, Dashboard, Profile, etc.)
  • Test Preferences: Configure what to test on each page (buttons, forms, links)
  • Page Dependencies: Set up realistic user flows (login → dashboard → profile)
  • Login Credentials: Configure both success and failure scenarios
  • Selector Targeting: Specify which elements to prioritize for testing
  • Fuzzing Options: Enable input fuzzing for form-heavy pages

The configurator generates a simple YAML file that TestAgent uses to run your tests.

🛠️ Local Development

git clone https://github.com/abalakrishnan1/testagent.git
cd testagent
# Set up development environment
make setup
# Configure your API key
cp .env.example .env
# Edit .env and add your GOOGLE_API_KEY

🚦 Usage

With Configuration File

# Create config using the frontend, then run:
python main.py --config config.yml --url https://your-app.com
# Or test a specific URL without config
python main.py --url https://www.saucedemo.com/
# Use with make for convenience
make run
# Run with Docker
make docker-run

Command Line Options

python main.py [OPTIONS]
Options:
--config PATH Path to configuration YAML file generated by frontend
--url URL URL to test --browser BROWSER Browser to use (chromium, firefox, webkit)
--headless BOOL Run in headless mode (true/false)
--timeout INT Test timeout in seconds
--max-tests INT Maximum number of tests to generate
--output-format STR Output format (console, github-action)

Configuration File Format

While the TestAgent Configurator is the recommended way to create configuration files, here's the expected YAML structure:

# config.ymlLogin:
Buttons: true # Test button interactionsLinks: false # Skip link testing Input_fields: true # Test input fieldspage_fuzzing: false # Skip fuzzing testsselectors: # CSS selectors to prioritize
- "#username"
- "#password"
- "#login-btn"depends_on: [] # Page dependenciesError: # Login failure credentialsUsername: "invalid@example.com"Password: "wrongpassword"Success: # Login success credentials Username: "test@example.com"Password: "validpassword"Dashboard:
Buttons: trueLinks: trueInput_fields: truepage_fuzzing: falseselectors:
- "#navigation"
- ".action-button"depends_on: ["Login"] # Must login first

See config.example.yml for a complete example.


### Advanced Usage
```bash
# Run with performance monitoring
make perf-test
# Run full CI pipeline locally
make ci
# Run specific test types
make test-unit # Unit tests only
make test-integration # Integration tests only
# Code quality checks
make lint # Run linting
make format # Format code
make security # Security scan

🏗 How it works

  1. UI Capture (ui_state.py): Captures your app's HTML and takes screenshots
  2. Test Planning (planner.py): Uses Gemini with few-shot examples to generate intelligent test cases
  3. Test Execution (execute.py): Runs Playwright tests with detailed reporting
  4. Result Analysis: Saves screenshots, logs, and generates comprehensive reports

📁 Project Structure

testagent/
├── main.py # Entry point and orchestration
├── containers.py # Container management for test apps
├── ui_state.py # UI capture and screenshot functionality
├── planner.py # LLM-powered test plan generation
├── execute.py # Playwright test execution engine
├── few_shot_examples.py # Prompt engineering examples
├── requirements.txt # Production dependencies
├── requirements-dev.txt # Development dependencies
├── Dockerfile # Multi-stage Docker build
├── docker-compose.yml # Container orchestration
├── Makefile # Development automation
├── pyproject.toml # Python project configuration
├── .github/workflows/ # CI/CD pipelines
│ ├── ci.yml # Main CI/CD pipeline
│ ├── scheduled.yml # Scheduled testing
│ └── dependencies.yml # Dependency updates
├── tests/ # Comprehensive test suite
├── frontend/ # React frontend (configuration UI)
└── results/ # Test outputs and screenshots

🧪 Testing

Running Tests

# Run all tests
make test# Run specific test categories
pytest tests/test_ui_state.py -v # UI capture tests
pytest tests/test_planner.py -v # Test planning tests
pytest tests/test_execute.py -v # Execution tests
pytest tests/test_integration.py -v # End-to-end tests# Run with coverage
make test-unit

Test Categories

  • Unit Tests: Individual component testing
  • Integration Tests: Full workflow testing
  • Security Tests: Vulnerability scanning
  • Performance Tests: Memory and execution profiling

🚀 CI/CD Pipeline

The project includes comprehensive GitHub Actions workflows:

Main CI Pipeline (.github/workflows/ci.yml)

  • ✅ Python code testing and linting
  • ✅ Frontend testing and building
  • ✅ Integration testing
  • ✅ Security vulnerability scanning
  • ✅ Automated deployment to staging/production

Scheduled Testing (.github/workflows/scheduled.yml)

  • 🕐 Daily test runs against multiple demo sites
  • 📊 Performance monitoring
  • 🔔 Slack notifications for failures

Dependency Management (.github/workflows/dependencies.yml)

  • 📦 Weekly dependency updates
  • 🛡️ Security vulnerability checks
  • 🔄 Automated pull requests for updates

📊 Example Output

✅ Running test agent on https://www.saucedemo.com/
✅ UI captured
Got test plan from LLM
Generated tests:
{
"description": "SauceDemo login page tests",
"tests": [
{
"description": "Test successful login with valid credentials",
"steps": [
{"action": "type", "selector": "#user-name", "value": "standard_user"},
{"action": "type", "selector": "#password", "value": "secret_sauce"},
{"action": "click", "selector": "#login-button"}
],
"expect": {
"url": "/inventory.html"
}
},
{
"description": "Test navigation to product page",
"steps": [
{"action": "click", "selector": ".inventory_item_name"}
],
"expect": {
"selectorVisible": ".inventory_details"
}
}
]
}
▶ Running: Test successful login with valid credentials
✅ Passed
▶ Running: Test navigation to product page ✅ Passed
All tests executed successfully

🎯 Roadmap

Current Focus

  • ✅ CI/CD Integration
  • ✅ Comprehensive testing suite
  • ✅ Security scanning
  • ✅ Docker containerization

Upcoming Features

  • 🔄 Config YAML Integration: Standardized test case definitions
  • 🎯 Base Case Coverage: Ensure consistent test coverage
  • 🔄 Retry Logic: JSON parsing with LangChain retries
  • 🌐 Multi-page Testing: Complex user journey support
  • 🎲 Advanced Fuzzing: Input validation and edge case testing
  • 📊 Test Coverage Validation: Post-prompt processing
  • 🔍 Visual Regression Testing: Screenshot comparison
  • 📈 Performance Benchmarking: Load and stress testing

🤝 Contributing

Development Setup

# Clone and setup
git clone https://github.com/abalakrishnan1/testagent.git
cd testagent
make setup
# Make changes and test
make ci
# Submit pull request

Code Quality Standards

  • Code Formatting: Black + isort
  • Linting: flake8
  • Security: Bandit scanning
  • Testing: pytest with >90% coverage
  • Documentation: Comprehensive docstrings

Pre-commit Hooks

# Setup pre-commit hooks
make setup-hooks
# Manual run
pre-commit run --all-files

📄 License

MIT License - see LICENSE file for details.

🙏 Acknowledgments

About

Automated test generation and execution

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

🤖 TestAgent - Automated UI Testing for GitHub

CI/CD PipelineSecurity Scancodecov

TestAgent automatically generates and runs UI tests for your web applications using AI. Simply add it to your GitHub repository and it will test your UI on every pull request!

🚀 Quick Start for GitHub Actions

1. Create Your Test Configuration

Use the TestAgent frontend to generate your test configuration:

🎨 Open TestAgent Configurator

  1. Define your application's pages (Login, Dashboard, etc.)
  2. Configure test preferences for each page
  3. Set up page dependencies and login credentials
  4. Download the generated config.yml file

2. Add Configuration to Your Repository

Save the generated config.yml file to your repository root or .github/ directory.

3. Add TestAgent GitHub Action

Create .github/workflows/testagent.yml in your repository:

name: TestAgent UI Testingon:
pull_request:
branches: [ main, master, develop ]jobs:
ui-tests:
runs-on: ubuntu-latestname: Automated UI Testingsteps:
- name: Checkout repositoryuses: actions/checkout@v4
- name: Run TestAgentuses: abalakrishnan1/testagent@mainwith:
url: 'https://your-app-url.com'# Replace with your app URLconfig-file: 'config.yml'# Path to your config filegoogle-api-key: ${{ secrets.GOOGLE_API_KEY }}comment-on-pr: 'true'

4. Add API Key to Repository Secrets

  1. Go to your repository → Settings → Secrets and variables → Actions
  2. Click "New repository secret"
  3. Name: GOOGLE_API_KEY
  4. Value: Your Google Gemini API key (Get one here)

5. That's it! 🎉

TestAgent will now run on every pull request and:

  • 🔍 Use your configuration to test specific pages and workflows
  • 🧪 Generate intelligent test cases based on your UI structure
  • 🤖 Execute tests automatically with proper page dependencies
  • 🏃‍♂️ Execute tests in a real browser
  • 📊 Save test results, screenshots, and detailed reports as GitHub Action artifacts

🎨 Configuration Made Easy

🔗 Open TestAgent Configurator

Our visual configurator makes it easy to set up your tests:

  • Page Definition: Define your app's pages (Login, Dashboard, Profile, etc.)
  • Test Preferences: Configure what to test on each page (buttons, forms, links)
  • Page Dependencies: Set up realistic user flows (login → dashboard → profile)
  • Login Credentials: Configure both success and failure scenarios
  • Selector Targeting: Specify which elements to prioritize for testing
  • Fuzzing Options: Enable input fuzzing for form-heavy pages

The configurator generates a simple YAML file that TestAgent uses to run your tests.

🛠️ Local Development

git clone https://github.com/abalakrishnan1/testagent.git
cd testagent
# Set up development environment
make setup
# Configure your API key
cp .env.example .env
# Edit .env and add your GOOGLE_API_KEY

🚦 Usage

With Configuration File

# Create config using the frontend, then run:
python main.py --config config.yml --url https://your-app.com
# Or test a specific URL without config
python main.py --url https://www.saucedemo.com/
# Use with make for convenience
make run
# Run with Docker
make docker-run

Command Line Options

python main.py [OPTIONS]
Options:
--config PATH Path to configuration YAML file generated by frontend
--url URL URL to test --browser BROWSER Browser to use (chromium, firefox, webkit)
--headless BOOL Run in headless mode (true/false)
--timeout INT Test timeout in seconds
--max-tests INT Maximum number of tests to generate
--output-format STR Output format (console, github-action)

Configuration File Format

While the TestAgent Configurator is the recommended way to create configuration files, here's the expected YAML structure:

# config.ymlLogin:
Buttons: true # Test button interactionsLinks: false # Skip link testing Input_fields: true # Test input fieldspage_fuzzing: false # Skip fuzzing testsselectors: # CSS selectors to prioritize
- "#username"
- "#password"
- "#login-btn"depends_on: [] # Page dependenciesError: # Login failure credentialsUsername: "invalid@example.com"Password: "wrongpassword"Success: # Login success credentials Username: "test@example.com"Password: "validpassword"Dashboard:
Buttons: trueLinks: trueInput_fields: truepage_fuzzing: falseselectors:
- "#navigation"
- ".action-button"depends_on: ["Login"] # Must login first

See config.example.yml for a complete example.


### Advanced Usage
```bash
# Run with performance monitoring
make perf-test
# Run full CI pipeline locally
make ci
# Run specific test types
make test-unit # Unit tests only
make test-integration # Integration tests only
# Code quality checks
make lint # Run linting
make format # Format code
make security # Security scan

🏗 How it works

  1. UI Capture (ui_state.py): Captures your app's HTML and takes screenshots
  2. Test Planning (planner.py): Uses Gemini with few-shot examples to generate intelligent test cases
  3. Test Execution (execute.py): Runs Playwright tests with detailed reporting
  4. Result Analysis: Saves screenshots, logs, and generates comprehensive reports

📁 Project Structure

testagent/
├── main.py # Entry point and orchestration
├── containers.py # Container management for test apps
├── ui_state.py # UI capture and screenshot functionality
├── planner.py # LLM-powered test plan generation
├── execute.py # Playwright test execution engine
├── few_shot_examples.py # Prompt engineering examples
├── requirements.txt # Production dependencies
├── requirements-dev.txt # Development dependencies
├── Dockerfile # Multi-stage Docker build
├── docker-compose.yml # Container orchestration
├── Makefile # Development automation
├── pyproject.toml # Python project configuration
├── .github/workflows/ # CI/CD pipelines
│ ├── ci.yml # Main CI/CD pipeline
│ ├── scheduled.yml # Scheduled testing
│ └── dependencies.yml # Dependency updates
├── tests/ # Comprehensive test suite
├── frontend/ # React frontend (configuration UI)
└── results/ # Test outputs and screenshots

🧪 Testing

Running Tests

# Run all tests
make test# Run specific test categories
pytest tests/test_ui_state.py -v # UI capture tests
pytest tests/test_planner.py -v # Test planning tests
pytest tests/test_execute.py -v # Execution tests
pytest tests/test_integration.py -v # End-to-end tests# Run with coverage
make test-unit

Test Categories

  • Unit Tests: Individual component testing
  • Integration Tests: Full workflow testing
  • Security Tests: Vulnerability scanning
  • Performance Tests: Memory and execution profiling

🚀 CI/CD Pipeline

The project includes comprehensive GitHub Actions workflows:

Main CI Pipeline (.github/workflows/ci.yml)

  • ✅ Python code testing and linting
  • ✅ Frontend testing and building
  • ✅ Integration testing
  • ✅ Security vulnerability scanning
  • ✅ Automated deployment to staging/production

Scheduled Testing (.github/workflows/scheduled.yml)

  • 🕐 Daily test runs against multiple demo sites
  • 📊 Performance monitoring
  • 🔔 Slack notifications for failures

Dependency Management (.github/workflows/dependencies.yml)

  • 📦 Weekly dependency updates
  • 🛡️ Security vulnerability checks
  • 🔄 Automated pull requests for updates

📊 Example Output

✅ Running test agent on https://www.saucedemo.com/
✅ UI captured
Got test plan from LLM
Generated tests:
{
"description": "SauceDemo login page tests",
"tests": [
{
"description": "Test successful login with valid credentials",
"steps": [
{"action": "type", "selector": "#user-name", "value": "standard_user"},
{"action": "type", "selector": "#password", "value": "secret_sauce"},
{"action": "click", "selector": "#login-button"}
],
"expect": {
"url": "/inventory.html"
}
},
{
"description": "Test navigation to product page",
"steps": [
{"action": "click", "selector": ".inventory_item_name"}
],
"expect": {
"selectorVisible": ".inventory_details"
}
}
]
}
▶ Running: Test successful login with valid credentials
✅ Passed
▶ Running: Test navigation to product page ✅ Passed
All tests executed successfully

🎯 Roadmap

Current Focus

  • ✅ CI/CD Integration
  • ✅ Comprehensive testing suite
  • ✅ Security scanning
  • ✅ Docker containerization

Upcoming Features

  • 🔄 Config YAML Integration: Standardized test case definitions
  • 🎯 Base Case Coverage: Ensure consistent test coverage
  • 🔄 Retry Logic: JSON parsing with LangChain retries
  • 🌐 Multi-page Testing: Complex user journey support
  • 🎲 Advanced Fuzzing: Input validation and edge case testing
  • 📊 Test Coverage Validation: Post-prompt processing
  • 🔍 Visual Regression Testing: Screenshot comparison
  • 📈 Performance Benchmarking: Load and stress testing

🤝 Contributing

Development Setup

# Clone and setup
git clone https://github.com/abalakrishnan1/testagent.git
cd testagent
make setup
# Make changes and test
make ci
# Submit pull request

Code Quality Standards

  • Code Formatting: Black + isort
  • Linting: flake8
  • Security: Bandit scanning
  • Testing: pytest with >90% coverage
  • Documentation: Comprehensive docstrings

Pre-commit Hooks

# Setup pre-commit hooks
make setup-hooks
# Manual run
pre-commit run --all-files

📄 License

MIT License - see LICENSE file for details.

🙏 Acknowledgments

About

Automated test generation and execution

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

🤖 TestAgent - Automated UI Testing for GitHub

CI/CD PipelineSecurity Scancodecov

TestAgent automatically generates and runs UI tests for your web applications using AI. Simply add it to your GitHub repository and it will test your UI on every pull request!

🚀 Quick Start for GitHub Actions

1. Create Your Test Configuration

Use the TestAgent frontend to generate your test configuration:

🎨 Open TestAgent Configurator

  1. Define your application's pages (Login, Dashboard, etc.)
  2. Configure test preferences for each page
  3. Set up page dependencies and login credentials
  4. Download the generated config.yml file

2. Add Configuration to Your Repository

Save the generated config.yml file to your repository root or .github/ directory.

3. Add TestAgent GitHub Action

Create .github/workflows/testagent.yml in your repository:

name: TestAgent UI Testingon:
pull_request:
branches: [ main, master, develop ]jobs:
ui-tests:
runs-on: ubuntu-latestname: Automated UI Testingsteps:
- name: Checkout repositoryuses: actions/checkout@v4
- name: Run TestAgentuses: abalakrishnan1/testagent@mainwith:
url: 'https://your-app-url.com'# Replace with your app URLconfig-file: 'config.yml'# Path to your config filegoogle-api-key: ${{ secrets.GOOGLE_API_KEY }}comment-on-pr: 'true'

4. Add API Key to Repository Secrets

  1. Go to your repository → Settings → Secrets and variables → Actions
  2. Click "New repository secret"
  3. Name: GOOGLE_API_KEY
  4. Value: Your Google Gemini API key (Get one here)

5. That's it! 🎉

TestAgent will now run on every pull request and:

  • 🔍 Use your configuration to test specific pages and workflows
  • 🧪 Generate intelligent test cases based on your UI structure
  • 🤖 Execute tests automatically with proper page dependencies
  • 🏃‍♂️ Execute tests in a real browser
  • 📊 Save test results, screenshots, and detailed reports as GitHub Action artifacts

🎨 Configuration Made Easy

🔗 Open TestAgent Configurator

Our visual configurator makes it easy to set up your tests:

  • Page Definition: Define your app's pages (Login, Dashboard, Profile, etc.)
  • Test Preferences: Configure what to test on each page (buttons, forms, links)
  • Page Dependencies: Set up realistic user flows (login → dashboard → profile)
  • Login Credentials: Configure both success and failure scenarios
  • Selector Targeting: Specify which elements to prioritize for testing
  • Fuzzing Options: Enable input fuzzing for form-heavy pages

The configurator generates a simple YAML file that TestAgent uses to run your tests.

🛠️ Local Development

git clone https://github.com/abalakrishnan1/testagent.git
cd testagent
# Set up development environment
make setup
# Configure your API key
cp .env.example .env
# Edit .env and add your GOOGLE_API_KEY

🚦 Usage

With Configuration File

# Create config using the frontend, then run:
python main.py --config config.yml --url https://your-app.com
# Or test a specific URL without config
python main.py --url https://www.saucedemo.com/
# Use with make for convenience
make run
# Run with Docker
make docker-run

Command Line Options

python main.py [OPTIONS]
Options:
--config PATH Path to configuration YAML file generated by frontend
--url URL URL to test --browser BROWSER Browser to use (chromium, firefox, webkit)
--headless BOOL Run in headless mode (true/false)
--timeout INT Test timeout in seconds
--max-tests INT Maximum number of tests to generate
--output-format STR Output format (console, github-action)

Configuration File Format

While the TestAgent Configurator is the recommended way to create configuration files, here's the expected YAML structure:

# config.ymlLogin:
Buttons: true # Test button interactionsLinks: false # Skip link testing Input_fields: true # Test input fieldspage_fuzzing: false # Skip fuzzing testsselectors: # CSS selectors to prioritize
- "#username"
- "#password"
- "#login-btn"depends_on: [] # Page dependenciesError: # Login failure credentialsUsername: "invalid@example.com"Password: "wrongpassword"Success: # Login success credentials Username: "test@example.com"Password: "validpassword"Dashboard:
Buttons: trueLinks: trueInput_fields: truepage_fuzzing: falseselectors:
- "#navigation"
- ".action-button"depends_on: ["Login"] # Must login first

See config.example.yml for a complete example.


### Advanced Usage
```bash
# Run with performance monitoring
make perf-test
# Run full CI pipeline locally
make ci
# Run specific test types
make test-unit # Unit tests only
make test-integration # Integration tests only
# Code quality checks
make lint # Run linting
make format # Format code
make security # Security scan

🏗 How it works

  1. UI Capture (ui_state.py): Captures your app's HTML and takes screenshots
  2. Test Planning (planner.py): Uses Gemini with few-shot examples to generate intelligent test cases
  3. Test Execution (execute.py): Runs Playwright tests with detailed reporting
  4. Result Analysis: Saves screenshots, logs, and generates comprehensive reports

📁 Project Structure

testagent/
├── main.py # Entry point and orchestration
├── containers.py # Container management for test apps
├── ui_state.py # UI capture and screenshot functionality
├── planner.py # LLM-powered test plan generation
├── execute.py # Playwright test execution engine
├── few_shot_examples.py # Prompt engineering examples
├── requirements.txt # Production dependencies
├── requirements-dev.txt # Development dependencies
├── Dockerfile # Multi-stage Docker build
├── docker-compose.yml # Container orchestration
├── Makefile # Development automation
├── pyproject.toml # Python project configuration
├── .github/workflows/ # CI/CD pipelines
│ ├── ci.yml # Main CI/CD pipeline
│ ├── scheduled.yml # Scheduled testing
│ └── dependencies.yml # Dependency updates
├── tests/ # Comprehensive test suite
├── frontend/ # React frontend (configuration UI)
└── results/ # Test outputs and screenshots

🧪 Testing

Running Tests

# Run all tests
make test# Run specific test categories
pytest tests/test_ui_state.py -v # UI capture tests
pytest tests/test_planner.py -v # Test planning tests
pytest tests/test_execute.py -v # Execution tests
pytest tests/test_integration.py -v # End-to-end tests# Run with coverage
make test-unit

Test Categories

  • Unit Tests: Individual component testing
  • Integration Tests: Full workflow testing
  • Security Tests: Vulnerability scanning
  • Performance Tests: Memory and execution profiling

🚀 CI/CD Pipeline

The project includes comprehensive GitHub Actions workflows:

Main CI Pipeline (.github/workflows/ci.yml)

  • ✅ Python code testing and linting
  • ✅ Frontend testing and building
  • ✅ Integration testing
  • ✅ Security vulnerability scanning
  • ✅ Automated deployment to staging/production

Scheduled Testing (.github/workflows/scheduled.yml)

  • 🕐 Daily test runs against multiple demo sites
  • 📊 Performance monitoring
  • 🔔 Slack notifications for failures

Dependency Management (.github/workflows/dependencies.yml)

  • 📦 Weekly dependency updates
  • 🛡️ Security vulnerability checks
  • 🔄 Automated pull requests for updates

📊 Example Output

✅ Running test agent on https://www.saucedemo.com/
✅ UI captured
Got test plan from LLM
Generated tests:
{
"description": "SauceDemo login page tests",
"tests": [
{
"description": "Test successful login with valid credentials",
"steps": [
{"action": "type", "selector": "#user-name", "value": "standard_user"},
{"action": "type", "selector": "#password", "value": "secret_sauce"},
{"action": "click", "selector": "#login-button"}
],
"expect": {
"url": "/inventory.html"
}
},
{
"description": "Test navigation to product page",
"steps": [
{"action": "click", "selector": ".inventory_item_name"}
],
"expect": {
"selectorVisible": ".inventory_details"
}
}
]
}
▶ Running: Test successful login with valid credentials
✅ Passed
▶ Running: Test navigation to product page ✅ Passed
All tests executed successfully

🎯 Roadmap

Current Focus

  • ✅ CI/CD Integration
  • ✅ Comprehensive testing suite
  • ✅ Security scanning
  • ✅ Docker containerization

Upcoming Features

  • 🔄 Config YAML Integration: Standardized test case definitions
  • 🎯 Base Case Coverage: Ensure consistent test coverage
  • 🔄 Retry Logic: JSON parsing with LangChain retries
  • 🌐 Multi-page Testing: Complex user journey support
  • 🎲 Advanced Fuzzing: Input validation and edge case testing
  • 📊 Test Coverage Validation: Post-prompt processing
  • 🔍 Visual Regression Testing: Screenshot comparison
  • 📈 Performance Benchmarking: Load and stress testing

🤝 Contributing

Development Setup

# Clone and setup
git clone https://github.com/abalakrishnan1/testagent.git
cd testagent
make setup
# Make changes and test
make ci
# Submit pull request

Code Quality Standards

  • Code Formatting: Black + isort
  • Linting: flake8
  • Security: Bandit scanning
  • Testing: pytest with >90% coverage
  • Documentation: Comprehensive docstrings

Pre-commit Hooks

# Setup pre-commit hooks
make setup-hooks
# Manual run
pre-commit run --all-files

📄 License

MIT License - see LICENSE file for details.

🙏 Acknowledgments

About

Automated test generation and execution

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

🤖 TestAgent - Automated UI Testing for GitHub

CI/CD PipelineSecurity Scancodecov

TestAgent automatically generates and runs UI tests for your web applications using AI. Simply add it to your GitHub repository and it will test your UI on every pull request!

🚀 Quick Start for GitHub Actions

1. Create Your Test Configuration

Use the TestAgent frontend to generate your test configuration:

🎨 Open TestAgent Configurator

  1. Define your application's pages (Login, Dashboard, etc.)
  2. Configure test preferences for each page
  3. Set up page dependencies and login credentials
  4. Download the generated config.yml file

2. Add Configuration to Your Repository

Save the generated config.yml file to your repository root or .github/ directory.

3. Add TestAgent GitHub Action

Create .github/workflows/testagent.yml in your repository:

name: TestAgent UI Testingon:
pull_request:
branches: [ main, master, develop ]jobs:
ui-tests:
runs-on: ubuntu-latestname: Automated UI Testingsteps:
- name: Checkout repositoryuses: actions/checkout@v4
- name: Run TestAgentuses: abalakrishnan1/testagent@mainwith:
url: 'https://your-app-url.com'# Replace with your app URLconfig-file: 'config.yml'# Path to your config filegoogle-api-key: ${{ secrets.GOOGLE_API_KEY }}comment-on-pr: 'true'

4. Add API Key to Repository Secrets

  1. Go to your repository → Settings → Secrets and variables → Actions
  2. Click "New repository secret"
  3. Name: GOOGLE_API_KEY
  4. Value: Your Google Gemini API key (Get one here)

5. That's it! 🎉

TestAgent will now run on every pull request and:

  • 🔍 Use your configuration to test specific pages and workflows
  • 🧪 Generate intelligent test cases based on your UI structure
  • 🤖 Execute tests automatically with proper page dependencies
  • 🏃‍♂️ Execute tests in a real browser
  • 📊 Save test results, screenshots, and detailed reports as GitHub Action artifacts

🎨 Configuration Made Easy

🔗 Open TestAgent Configurator

Our visual configurator makes it easy to set up your tests:

  • Page Definition: Define your app's pages (Login, Dashboard, Profile, etc.)
  • Test Preferences: Configure what to test on each page (buttons, forms, links)
  • Page Dependencies: Set up realistic user flows (login → dashboard → profile)
  • Login Credentials: Configure both success and failure scenarios
  • Selector Targeting: Specify which elements to prioritize for testing
  • Fuzzing Options: Enable input fuzzing for form-heavy pages

The configurator generates a simple YAML file that TestAgent uses to run your tests.

🛠️ Local Development

git clone https://github.com/abalakrishnan1/testagent.git
cd testagent
# Set up development environment
make setup
# Configure your API key
cp .env.example .env
# Edit .env and add your GOOGLE_API_KEY

🚦 Usage

With Configuration File

# Create config using the frontend, then run:
python main.py --config config.yml --url https://your-app.com
# Or test a specific URL without config
python main.py --url https://www.saucedemo.com/
# Use with make for convenience
make run
# Run with Docker
make docker-run

Command Line Options

python main.py [OPTIONS]
Options:
--config PATH Path to configuration YAML file generated by frontend
--url URL URL to test --browser BROWSER Browser to use (chromium, firefox, webkit)
--headless BOOL Run in headless mode (true/false)
--timeout INT Test timeout in seconds
--max-tests INT Maximum number of tests to generate
--output-format STR Output format (console, github-action)

Configuration File Format

While the TestAgent Configurator is the recommended way to create configuration files, here's the expected YAML structure:

# config.ymlLogin:
Buttons: true # Test button interactionsLinks: false # Skip link testing Input_fields: true # Test input fieldspage_fuzzing: false # Skip fuzzing testsselectors: # CSS selectors to prioritize
- "#username"
- "#password"
- "#login-btn"depends_on: [] # Page dependenciesError: # Login failure credentialsUsername: "invalid@example.com"Password: "wrongpassword"Success: # Login success credentials Username: "test@example.com"Password: "validpassword"Dashboard:
Buttons: trueLinks: trueInput_fields: truepage_fuzzing: falseselectors:
- "#navigation"
- ".action-button"depends_on: ["Login"] # Must login first

See config.example.yml for a complete example.


### Advanced Usage
```bash
# Run with performance monitoring
make perf-test
# Run full CI pipeline locally
make ci
# Run specific test types
make test-unit # Unit tests only
make test-integration # Integration tests only
# Code quality checks
make lint # Run linting
make format # Format code
make security # Security scan

🏗 How it works

  1. UI Capture (ui_state.py): Captures your app's HTML and takes screenshots
  2. Test Planning (planner.py): Uses Gemini with few-shot examples to generate intelligent test cases
  3. Test Execution (execute.py): Runs Playwright tests with detailed reporting
  4. Result Analysis: Saves screenshots, logs, and generates comprehensive reports

📁 Project Structure

testagent/
├── main.py # Entry point and orchestration
├── containers.py # Container management for test apps
├── ui_state.py # UI capture and screenshot functionality
├── planner.py # LLM-powered test plan generation
├── execute.py # Playwright test execution engine
├── few_shot_examples.py # Prompt engineering examples
├── requirements.txt # Production dependencies
├── requirements-dev.txt # Development dependencies
├── Dockerfile # Multi-stage Docker build
├── docker-compose.yml # Container orchestration
├── Makefile # Development automation
├── pyproject.toml # Python project configuration
├── .github/workflows/ # CI/CD pipelines
│ ├── ci.yml # Main CI/CD pipeline
│ ├── scheduled.yml # Scheduled testing
│ └── dependencies.yml # Dependency updates
├── tests/ # Comprehensive test suite
├── frontend/ # React frontend (configuration UI)
└── results/ # Test outputs and screenshots

🧪 Testing

Running Tests

# Run all tests
make test# Run specific test categories
pytest tests/test_ui_state.py -v # UI capture tests
pytest tests/test_planner.py -v # Test planning tests
pytest tests/test_execute.py -v # Execution tests
pytest tests/test_integration.py -v # End-to-end tests# Run with coverage
make test-unit

Test Categories

  • Unit Tests: Individual component testing
  • Integration Tests: Full workflow testing
  • Security Tests: Vulnerability scanning
  • Performance Tests: Memory and execution profiling

🚀 CI/CD Pipeline

The project includes comprehensive GitHub Actions workflows:

Main CI Pipeline (.github/workflows/ci.yml)

  • ✅ Python code testing and linting
  • ✅ Frontend testing and building
  • ✅ Integration testing
  • ✅ Security vulnerability scanning
  • ✅ Automated deployment to staging/production

Scheduled Testing (.github/workflows/scheduled.yml)

  • 🕐 Daily test runs against multiple demo sites
  • 📊 Performance monitoring
  • 🔔 Slack notifications for failures

Dependency Management (.github/workflows/dependencies.yml)

  • 📦 Weekly dependency updates
  • 🛡️ Security vulnerability checks
  • 🔄 Automated pull requests for updates

📊 Example Output

✅ Running test agent on https://www.saucedemo.com/
✅ UI captured
Got test plan from LLM
Generated tests:
{
"description": "SauceDemo login page tests",
"tests": [
{
"description": "Test successful login with valid credentials",
"steps": [
{"action": "type", "selector": "#user-name", "value": "standard_user"},
{"action": "type", "selector": "#password", "value": "secret_sauce"},
{"action": "click", "selector": "#login-button"}
],
"expect": {
"url": "/inventory.html"
}
},
{
"description": "Test navigation to product page",
"steps": [
{"action": "click", "selector": ".inventory_item_name"}
],
"expect": {
"selectorVisible": ".inventory_details"
}
}
]
}
▶ Running: Test successful login with valid credentials
✅ Passed
▶ Running: Test navigation to product page ✅ Passed
All tests executed successfully

🎯 Roadmap

Current Focus

  • ✅ CI/CD Integration
  • ✅ Comprehensive testing suite
  • ✅ Security scanning
  • ✅ Docker containerization

Upcoming Features

  • 🔄 Config YAML Integration: Standardized test case definitions
  • 🎯 Base Case Coverage: Ensure consistent test coverage
  • 🔄 Retry Logic: JSON parsing with LangChain retries
  • 🌐 Multi-page Testing: Complex user journey support
  • 🎲 Advanced Fuzzing: Input validation and edge case testing
  • 📊 Test Coverage Validation: Post-prompt processing
  • 🔍 Visual Regression Testing: Screenshot comparison
  • 📈 Performance Benchmarking: Load and stress testing

🤝 Contributing

Development Setup

# Clone and setup
git clone https://github.com/abalakrishnan1/testagent.git
cd testagent
make setup
# Make changes and test
make ci
# Submit pull request

Code Quality Standards

  • Code Formatting: Black + isort
  • Linting: flake8
  • Security: Bandit scanning
  • Testing: pytest with >90% coverage
  • Documentation: Comprehensive docstrings

Pre-commit Hooks

# Setup pre-commit hooks
make setup-hooks
# Manual run
pre-commit run --all-files

📄 License

MIT License - see LICENSE file for details.

🙏 Acknowledgments

About

Automated test generation and execution

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

🤖 TestAgent - Automated UI Testing for GitHub

CI/CD PipelineSecurity Scancodecov

TestAgent automatically generates and runs UI tests for your web applications using AI. Simply add it to your GitHub repository and it will test your UI on every pull request!

🚀 Quick Start for GitHub Actions

1. Create Your Test Configuration

Use the TestAgent frontend to generate your test configuration:

🎨 Open TestAgent Configurator

  1. Define your application's pages (Login, Dashboard, etc.)
  2. Configure test preferences for each page
  3. Set up page dependencies and login credentials
  4. Download the generated config.yml file

2. Add Configuration to Your Repository

Save the generated config.yml file to your repository root or .github/ directory.

3. Add TestAgent GitHub Action

Create .github/workflows/testagent.yml in your repository:

name: TestAgent UI Testingon:
pull_request:
branches: [ main, master, develop ]jobs:
ui-tests:
runs-on: ubuntu-latestname: Automated UI Testingsteps:
- name: Checkout repositoryuses: actions/checkout@v4
- name: Run TestAgentuses: abalakrishnan1/testagent@mainwith:
url: 'https://your-app-url.com'# Replace with your app URLconfig-file: 'config.yml'# Path to your config filegoogle-api-key: ${{ secrets.GOOGLE_API_KEY }}comment-on-pr: 'true'

4. Add API Key to Repository Secrets

  1. Go to your repository → Settings → Secrets and variables → Actions
  2. Click "New repository secret"
  3. Name: GOOGLE_API_KEY
  4. Value: Your Google Gemini API key (Get one here)

5. That's it! 🎉

TestAgent will now run on every pull request and:

  • 🔍 Use your configuration to test specific pages and workflows
  • 🧪 Generate intelligent test cases based on your UI structure
  • 🤖 Execute tests automatically with proper page dependencies
  • 🏃‍♂️ Execute tests in a real browser
  • 📊 Save test results, screenshots, and detailed reports as GitHub Action artifacts

🎨 Configuration Made Easy

🔗 Open TestAgent Configurator

Our visual configurator makes it easy to set up your tests:

  • Page Definition: Define your app's pages (Login, Dashboard, Profile, etc.)
  • Test Preferences: Configure what to test on each page (buttons, forms, links)
  • Page Dependencies: Set up realistic user flows (login → dashboard → profile)
  • Login Credentials: Configure both success and failure scenarios
  • Selector Targeting: Specify which elements to prioritize for testing
  • Fuzzing Options: Enable input fuzzing for form-heavy pages

The configurator generates a simple YAML file that TestAgent uses to run your tests.

🛠️ Local Development

git clone https://github.com/abalakrishnan1/testagent.git
cd testagent
# Set up development environment
make setup
# Configure your API key
cp .env.example .env
# Edit .env and add your GOOGLE_API_KEY

🚦 Usage

With Configuration File

# Create config using the frontend, then run:
python main.py --config config.yml --url https://your-app.com
# Or test a specific URL without config
python main.py --url https://www.saucedemo.com/
# Use with make for convenience
make run
# Run with Docker
make docker-run

Command Line Options

python main.py [OPTIONS]
Options:
--config PATH Path to configuration YAML file generated by frontend
--url URL URL to test --browser BROWSER Browser to use (chromium, firefox, webkit)
--headless BOOL Run in headless mode (true/false)
--timeout INT Test timeout in seconds
--max-tests INT Maximum number of tests to generate
--output-format STR Output format (console, github-action)

Configuration File Format

While the TestAgent Configurator is the recommended way to create configuration files, here's the expected YAML structure:

# config.ymlLogin:
Buttons: true # Test button interactionsLinks: false # Skip link testing Input_fields: true # Test input fieldspage_fuzzing: false # Skip fuzzing testsselectors: # CSS selectors to prioritize
- "#username"
- "#password"
- "#login-btn"depends_on: [] # Page dependenciesError: # Login failure credentialsUsername: "invalid@example.com"Password: "wrongpassword"Success: # Login success credentials Username: "test@example.com"Password: "validpassword"Dashboard:
Buttons: trueLinks: trueInput_fields: truepage_fuzzing: falseselectors:
- "#navigation"
- ".action-button"depends_on: ["Login"] # Must login first

See config.example.yml for a complete example.


### Advanced Usage
```bash
# Run with performance monitoring
make perf-test
# Run full CI pipeline locally
make ci
# Run specific test types
make test-unit # Unit tests only
make test-integration # Integration tests only
# Code quality checks
make lint # Run linting
make format # Format code
make security # Security scan

🏗 How it works

  1. UI Capture (ui_state.py): Captures your app's HTML and takes screenshots
  2. Test Planning (planner.py): Uses Gemini with few-shot examples to generate intelligent test cases
  3. Test Execution (execute.py): Runs Playwright tests with detailed reporting
  4. Result Analysis: Saves screenshots, logs, and generates comprehensive reports

📁 Project Structure

testagent/
├── main.py # Entry point and orchestration
├── containers.py # Container management for test apps
├── ui_state.py # UI capture and screenshot functionality
├── planner.py # LLM-powered test plan generation
├── execute.py # Playwright test execution engine
├── few_shot_examples.py # Prompt engineering examples
├── requirements.txt # Production dependencies
├── requirements-dev.txt # Development dependencies
├── Dockerfile # Multi-stage Docker build
├── docker-compose.yml # Container orchestration
├── Makefile # Development automation
├── pyproject.toml # Python project configuration
├── .github/workflows/ # CI/CD pipelines
│ ├── ci.yml # Main CI/CD pipeline
│ ├── scheduled.yml # Scheduled testing
│ └── dependencies.yml # Dependency updates
├── tests/ # Comprehensive test suite
├── frontend/ # React frontend (configuration UI)
└── results/ # Test outputs and screenshots

🧪 Testing

Running Tests

# Run all tests
make test# Run specific test categories
pytest tests/test_ui_state.py -v # UI capture tests
pytest tests/test_planner.py -v # Test planning tests
pytest tests/test_execute.py -v # Execution tests
pytest tests/test_integration.py -v # End-to-end tests# Run with coverage
make test-unit

Test Categories

  • Unit Tests: Individual component testing
  • Integration Tests: Full workflow testing
  • Security Tests: Vulnerability scanning
  • Performance Tests: Memory and execution profiling

🚀 CI/CD Pipeline

The project includes comprehensive GitHub Actions workflows:

Main CI Pipeline (.github/workflows/ci.yml)

  • ✅ Python code testing and linting
  • ✅ Frontend testing and building
  • ✅ Integration testing
  • ✅ Security vulnerability scanning
  • ✅ Automated deployment to staging/production

Scheduled Testing (.github/workflows/scheduled.yml)

  • 🕐 Daily test runs against multiple demo sites
  • 📊 Performance monitoring
  • 🔔 Slack notifications for failures

Dependency Management (.github/workflows/dependencies.yml)

  • 📦 Weekly dependency updates
  • 🛡️ Security vulnerability checks
  • 🔄 Automated pull requests for updates

📊 Example Output

✅ Running test agent on https://www.saucedemo.com/
✅ UI captured
Got test plan from LLM
Generated tests:
{
"description": "SauceDemo login page tests",
"tests": [
{
"description": "Test successful login with valid credentials",
"steps": [
{"action": "type", "selector": "#user-name", "value": "standard_user"},
{"action": "type", "selector": "#password", "value": "secret_sauce"},
{"action": "click", "selector": "#login-button"}
],
"expect": {
"url": "/inventory.html"
}
},
{
"description": "Test navigation to product page",
"steps": [
{"action": "click", "selector": ".inventory_item_name"}
],
"expect": {
"selectorVisible": ".inventory_details"
}
}
]
}
▶ Running: Test successful login with valid credentials
✅ Passed
▶ Running: Test navigation to product page ✅ Passed
All tests executed successfully

🎯 Roadmap

Current Focus

  • ✅ CI/CD Integration
  • ✅ Comprehensive testing suite
  • ✅ Security scanning
  • ✅ Docker containerization

Upcoming Features

  • 🔄 Config YAML Integration: Standardized test case definitions
  • 🎯 Base Case Coverage: Ensure consistent test coverage
  • 🔄 Retry Logic: JSON parsing with LangChain retries
  • 🌐 Multi-page Testing: Complex user journey support
  • 🎲 Advanced Fuzzing: Input validation and edge case testing
  • 📊 Test Coverage Validation: Post-prompt processing
  • 🔍 Visual Regression Testing: Screenshot comparison
  • 📈 Performance Benchmarking: Load and stress testing

🤝 Contributing

Development Setup

# Clone and setup
git clone https://github.com/abalakrishnan1/testagent.git
cd testagent
make setup
# Make changes and test
make ci
# Submit pull request

Code Quality Standards

  • Code Formatting: Black + isort
  • Linting: flake8
  • Security: Bandit scanning
  • Testing: pytest with >90% coverage
  • Documentation: Comprehensive docstrings

Pre-commit Hooks

# Setup pre-commit hooks
make setup-hooks
# Manual run
pre-commit run --all-files

📄 License

MIT License - see LICENSE file for details.

🙏 Acknowledgments

About

Automated test generation and execution

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages