qt-test-fixture-generator
Generate Qt Test fixtures with mock QObject signals and slots, data-driven tests, and GUI testing setup
Best use case
qt-test-fixture-generator is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Generate Qt Test fixtures with mock QObject signals and slots, data-driven tests, and GUI testing setup
Teams using qt-test-fixture-generator should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/qt-test-fixture-generator/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How qt-test-fixture-generator Compares
| Feature / Agent | qt-test-fixture-generator | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Generate Qt Test fixtures with mock QObject signals and slots, data-driven tests, and GUI testing setup
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# qt-test-fixture-generator
Generate Qt Test fixtures with mock QObject signals and slots, data-driven tests, and GUI testing setup. This skill creates comprehensive test infrastructure for Qt applications.
## Capabilities
- Generate QTest-based test fixtures
- Create mock QObjects with signal/slot support
- Set up data-driven tests with QFETCH
- Configure GUI testing with QTestLib
- Generate test doubles for Qt classes
- Set up benchmark tests
- Configure test coverage reporting
- Generate CMake test integration
## Input Schema
```json
{
"type": "object",
"properties": {
"projectPath": {
"type": "string",
"description": "Path to the Qt project"
},
"classToTest": {
"type": "string",
"description": "Name of the class to generate tests for"
},
"testType": {
"enum": ["unit", "integration", "gui", "benchmark"],
"default": "unit"
},
"mockDependencies": {
"type": "array",
"items": { "type": "string" },
"description": "Classes to mock"
},
"dataProviders": {
"type": "array",
"items": {
"type": "object",
"properties": {
"testName": { "type": "string" },
"columns": { "type": "array" },
"rows": { "type": "array" }
}
}
},
"generateCoverage": {
"type": "boolean",
"default": true
}
},
"required": ["projectPath", "classToTest"]
}
```
## Output Schema
```json
{
"type": "object",
"properties": {
"success": { "type": "boolean" },
"files": {
"type": "array",
"items": {
"type": "object",
"properties": {
"path": { "type": "string" },
"type": { "enum": ["test", "mock", "cmake"] }
}
}
},
"runCommand": { "type": "string" }
},
"required": ["success"]
}
```
## Generated Test Fixture
```cpp
// tst_mywidget.cpp
#include <QtTest/QtTest>
#include <QSignalSpy>
#include "mywidget.h"
#include "mockservice.h"
class tst_MyWidget : public QObject
{
Q_OBJECT
private slots:
// Test lifecycle
void initTestCase(); // Before all tests
void cleanupTestCase(); // After all tests
void init(); // Before each test
void cleanup(); // After each test
// Unit tests
void testConstructor();
void testSetValue();
void testSetValue_data(); // Data provider
void testSignalEmission();
// GUI tests
void testButtonClick();
void testKeyboardInput();
// Benchmark
void benchmarkCalculation();
private:
MyWidget* m_widget;
MockService* m_mockService;
};
void tst_MyWidget::initTestCase()
{
// One-time setup
qDebug() << "Starting MyWidget tests";
}
void tst_MyWidget::cleanupTestCase()
{
// One-time cleanup
}
void tst_MyWidget::init()
{
// Create fresh instances for each test
m_mockService = new MockService(this);
m_widget = new MyWidget(m_mockService);
}
void tst_MyWidget::cleanup()
{
delete m_widget;
delete m_mockService;
m_widget = nullptr;
m_mockService = nullptr;
}
void tst_MyWidget::testConstructor()
{
QVERIFY(m_widget != nullptr);
QCOMPARE(m_widget->value(), 0);
QVERIFY(m_widget->isEnabled());
}
void tst_MyWidget::testSetValue_data()
{
// Data-driven test setup
QTest::addColumn<int>("input");
QTest::addColumn<int>("expected");
QTest::addColumn<bool>("shouldEmitSignal");
QTest::newRow("zero") << 0 << 0 << false;
QTest::newRow("positive") << 42 << 42 << true;
QTest::newRow("negative") << -10 << -10 << true;
QTest::newRow("max") << INT_MAX << INT_MAX << true;
}
void tst_MyWidget::testSetValue()
{
// Fetch test data
QFETCH(int, input);
QFETCH(int, expected);
QFETCH(bool, shouldEmitSignal);
QSignalSpy spy(m_widget, &MyWidget::valueChanged);
m_widget->setValue(input);
QCOMPARE(m_widget->value(), expected);
QCOMPARE(spy.count(), shouldEmitSignal ? 1 : 0);
}
void tst_MyWidget::testSignalEmission()
{
QSignalSpy spy(m_widget, &MyWidget::valueChanged);
QVERIFY(spy.isValid());
m_widget->setValue(100);
QCOMPARE(spy.count(), 1);
QList<QVariant> arguments = spy.takeFirst();
QCOMPARE(arguments.at(0).toInt(), 100);
}
void tst_MyWidget::testButtonClick()
{
// GUI testing
QPushButton* button = m_widget->findChild<QPushButton*>("submitButton");
QVERIFY(button != nullptr);
QSignalSpy spy(m_widget, &MyWidget::submitted);
QTest::mouseClick(button, Qt::LeftButton);
QCOMPARE(spy.count(), 1);
}
void tst_MyWidget::testKeyboardInput()
{
QLineEdit* input = m_widget->findChild<QLineEdit*>("nameInput");
QVERIFY(input != nullptr);
input->setFocus();
QTest::keyClicks(input, "Hello World");
QCOMPARE(input->text(), QString("Hello World"));
// Test keyboard shortcut
QTest::keyClick(m_widget, Qt::Key_S, Qt::ControlModifier);
// Verify save action triggered
}
void tst_MyWidget::benchmarkCalculation()
{
QBENCHMARK {
m_widget->performCalculation();
}
}
QTEST_MAIN(tst_MyWidget)
#include "tst_mywidget.moc"
```
## Mock Object
```cpp
// mockservice.h
#include <QObject>
class MockService : public QObject
{
Q_OBJECT
public:
explicit MockService(QObject* parent = nullptr) : QObject(parent) {}
// Track method calls
int fetchDataCallCount() const { return m_fetchDataCalls; }
void resetCalls() { m_fetchDataCalls = 0; }
// Configure return values
void setFetchDataResult(const QString& result) { m_fetchDataResult = result; }
public slots:
QString fetchData(int id) {
m_fetchDataCalls++;
m_lastFetchId = id;
emit dataRequested(id);
return m_fetchDataResult;
}
signals:
void dataRequested(int id);
public:
int lastFetchId() const { return m_lastFetchId; }
private:
int m_fetchDataCalls = 0;
int m_lastFetchId = -1;
QString m_fetchDataResult = "mock result";
};
```
## CMake Integration
```cmake
# tests/CMakeLists.txt
find_package(Qt6 REQUIRED COMPONENTS Test)
enable_testing()
# Add test executable
add_executable(tst_mywidget
tst_mywidget.cpp
mockservice.h
)
target_link_libraries(tst_mywidget PRIVATE
Qt6::Test
MyAppLib # Library under test
)
# Register with CTest
add_test(NAME tst_mywidget COMMAND tst_mywidget)
# Coverage (with gcov)
if(ENABLE_COVERAGE)
target_compile_options(tst_mywidget PRIVATE --coverage)
target_link_options(tst_mywidget PRIVATE --coverage)
endif()
```
## Running Tests
```bash
# Run all tests
ctest --test-dir build
# Run specific test
./build/tests/tst_mywidget
# Run with verbose output
./build/tests/tst_mywidget -v1
# Run specific test function
./build/tests/tst_mywidget testSetValue
# Run data-driven test with specific data row
./build/tests/tst_mywidget testSetValue:positive
# Output XML for CI
./build/tests/tst_mywidget -o results.xml,xml
```
## Best Practices
1. **One assertion per test**: Keep tests focused
2. **Use QSignalSpy**: Verify signal emissions
3. **Use data-driven tests**: Avoid code duplication
4. **Mock dependencies**: Isolate unit under test
5. **Test edge cases**: Boundary values, null inputs
6. **Name tests clearly**: Describe expected behavior
## Related Skills
- `qt-cmake-project-generator` - Project setup
- `desktop-unit-testing` process - Testing workflow
- `cross-platform-test-matrix` - CI testing
## Related Agents
- `qt-cpp-specialist` - Qt expertise
- `desktop-test-architect` - Test strategyRelated Skills
vitest
Vitest configuration, mocking, coverage, snapshot testing, and performance.
react-testing-library
React Testing Library patterns, queries, user events, and accessibility testing.
color-palette-generator
Generate accessible color palettes with WCAG compliance
tracing-schema-generator
Generate distributed tracing schemas for OpenTelemetry with Jaeger/Zipkin integration
metrics-schema-generator
Generate metrics schemas for Prometheus, OpenTelemetry, and Grafana dashboards
log-schema-generator
Generate structured logging schemas with correlation ID patterns and ELK/Splunk integration
load-test-generator
Generate load test scripts for k6, Locust, and Gatling from OpenAPI specs
graphql-schema-generator
Generate GraphQL schemas from data models with resolver stubs and federation support
docs-site-generator
Generate documentation sites using Docusaurus, MkDocs, or VuePress
dependency-graph-generator
Generate module dependency graphs with circular dependency detection and coupling metrics
dashboard-generator
Generate monitoring dashboards for Grafana and DataDog with alert integration
c4-diagram-generator
Specialized skill for generating C4 model architecture diagrams. Supports Structurizr DSL, PlantUML, and Mermaid formats with multi-level abstraction (Context, Container, Component, Code).