TestWidget.cpp_2

本文介绍了一个使用Qt创建的应用程序,该程序能够与Microsoft PowerPoint进行集成,实现演示文稿的打开、显示及幻灯片的切换等功能。通过Qt与COM组件对象的交互,展示了如何操作PowerPoint对象模型。
#include "TestWidget.h"
#include <Windows.h> 
#include "OfficeContainer.h"

DemoTestWidget::DemoTestWidget(QWidget *parent /*= NULL*/)
:m_index(1)
{
    initUI();
    initConnect();
    this->showMaximized();
}

DemoTestWidget::~DemoTestWidget()
{

}

void DemoTestWidget::initUI()
{
    pLblPath    = new QLabel(tr("Path:"),this);
    pTxtPath    = new QLineEdit(this);
    pBtnOpen    = new QPushButton(tr("Open"),this);
    pBtnSelect  = new QPushButton(tr("Select"),this);
    pBtnClose   = new QPushButton(tr("Close"),this);
    pComBox     = new QComboBox(this);

    /*
    officeDialogNew            = 0,
        officeDialogOpen           = 1,
        officeDialogSave           = 2,
        officeDialogSaveCopy       = 3,
        officeDialogPrint          = 4,
        officeDialogPageSetup      = 5,
        officeDialogProperties     = 6
    */
    pComBox->addItem("officeDialogNew");
    pComBox->addItem("officeDialogOpen");
    pComBox->addItem("officeDialogSave");
    pComBox->addItem("officeDialogSaveCopy");
    pComBox->addItem("officeDialogPrint");
    pComBox->addItem("officeDialogPageSetup");
    pComBox->addItem("officeDialogProperties");
    pBtnShowDlg = new QPushButton(tr("ShowDlg"),this);

    /*QHBoxLayout *hly001 = new QHBoxLayout();
    hly001->addWidget(pLblPath);
    hly001->addWidget(pTxtPath);
    hly001->addWidget(pBtnSelect);
    hly001->addWidget(pBtnOpen);
    hly001->addWidget(pBtnClose);
    hly001->addWidget(pComBox);
    hly001->addWidget(pBtnShowDlg);

    pCentrelWgt = new QWidget(this);
    pOfficeContainer    = new OfficeContainer(this);
    QVBoxLayout *vly0010 = new QVBoxLayout(pCentrelWgt);
    vly0010->addWidget(pOfficeContainer,1);

    QVBoxLayout *vly010 = new QVBoxLayout(this);
    vly010->addLayout(hly001);
    vly010->addWidget(pCentrelWgt,1);*/

    //test
    //officeContent=new QAxWidget("Powerpoint.Application",this);
    //officeContent->setGeometry(QRect(10, 10, 1000, 1000));
    //presentations = officeContent->querySubObject("Presentations"); 

    //QHBoxLayout *hly001 = new QHBoxLayout();
    //hly001->addWidget(pLblPath);
    //hly001->addWidget(pTxtPath);
    //hly001->addWidget(pBtnSelect);
    //hly001->addWidget(pBtnOpen);
    //hly001->addWidget(pBtnClose);
    //hly001->addWidget(pComBox);
    //hly001->addWidget(pBtnShowDlg);
    //pCentrelWgt   = new QWidget(this);

    ////pOfficeContainer    = new OfficeContainer(this);
    //QVBoxLayout *vly0010 = new QVBoxLayout(pCentrelWgt);
    //vly0010->addWidget(officeContent,1);

    //QVBoxLayout *vly010 = new QVBoxLayout(this);
    //vly010->addLayout(hly001);
    //vly010->addWidget(pCentrelWgt,1);

    //presentations->dynamicCall("Open(QString)", "C:\\Users\\LJ\\Desktop\\test.pptx");
    //word
    /*
    officeContent=new QAxWidget("Word.Document",this);
    officeContent->setGeometry(QRect(10, 10, 1000, 1000));officeContent->setControl("C:\\Users\\LJ\\Desktop\\test.docx");
    officeContent->show();*/


    //test2
    officeContent=new QAxWidget("Powerpoint.Application",this);
    officeContent->setGeometry(QRect(10, 10, 1000, 1000));
    presentations = static_cast<PowerPoint::Presentations*>(officeContent->querySubObject("Presentations"));
    //PowerPoint::Presentation *presentation;

    //pptApp = new PowerPoint::Application();
    //pptApp->dynamicCall("SetVisible(Office::MsoTriState)",true);
    //PowerPoint::Presentations* presentations = pptApp->Presentations();
    //PowerPoint::Presentation *presentation;
    if (presentations != NULL )
    {
        //PowerPoint::Presentation *presentation = presentations->Open("C:\\Users\\LJ\\Desktop\\test.pptx");
        //presentation = static_cast<PowerPoint::Presentation*>(presentations->querySubObject("Open(QString&)", "C:\\Users\\LJ\\Desktop\\test.pptx"));
        presentation = static_cast<PowerPoint::Presentation*>(presentations->querySubObject("Open(QString&)", "D:\\test.pptx"));


        //PowerPoint::Slides* slides = presentation->Slides();
        slides = static_cast<PowerPoint::Slides*>(presentation->querySubObject("Slides()"));

        QVariant index(m_index);
        //PowerPoint::Slide* slide = slides->Item(index);
        slide = static_cast<PowerPoint::Slide*>(slides->querySubObject("Item(QVariant&)", index));
        m_index++;


        //PowerPoint::SlideShowSettings* slideshow = presentation->SlideShowSettings();
        slideshow = static_cast<PowerPoint::SlideShowSettings*>(presentation->querySubObject("SlideShowSettings()"));

        //slideshow->Run();
        slideshow->dynamicCall("Run()");
    }

    QHBoxLayout *hly001 = new QHBoxLayout();
    hly001->addWidget(pLblPath);
    hly001->addWidget(pTxtPath);
    hly001->addWidget(pBtnSelect);
    hly001->addWidget(pBtnOpen);
    hly001->addWidget(pBtnClose);
    hly001->addWidget(pComBox);
    hly001->addWidget(pBtnShowDlg);
    pCentrelWgt = new QWidget(this);

    QVBoxLayout *vly0010 = new QVBoxLayout(pCentrelWgt);
    vly0010->addWidget(officeContent,1);

    QVBoxLayout *vly010 = new QVBoxLayout(this);
    vly010->addLayout(hly001);
    vly010->addWidget(pCentrelWgt,1);


    //test3:
    //officeContent=new QAxWidget("Powerpoint.Application",this);
    //officeContent->setGeometry(QRect(10, 10, 1000, 1000));
    //PowerPoint::Presentations* presentations = static_cast<PowerPoint::Presentations*>(officeContent->querySubObject("Presentations"));
    //PowerPoint::Presentation *presentation;

    ////pptApp = new PowerPoint::Application();
    ////pptApp->dynamicCall("SetVisible(Office::MsoTriState)",true);
    ////PowerPoint::Presentations* presentations = pptApp->Presentations();
    ////PowerPoint::Presentation *presentation;
    //if (presentations != NULL )
    //{
    //  /*PowerPoint::Presentation **/presentation = presentations->Open("C:\\Users\\LJ\\Desktop\\test.pptx");
    //}
    //


    //WId wid = (WId)FindWindow(L"PPTFrameClass",NULL);
    ////第三步:获取QWindow
    //QWindow *m_window;
    //m_window = QWindow::fromWinId(wid);
    //m_window->setFlags(m_window->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint); //这边可以设置一下属性
    ////第四步:获取代理QWidget
    //QWidget *m_widget;
    //m_widget = QWidget::createWindowContainer(m_window,this); //第二个参数是作为window的父类,也可以用layout,此处就不解释了
    //
    //QHBoxLayout *hly001 = new QHBoxLayout();
    //hly001->addWidget(pLblPath);
    //hly001->addWidget(pTxtPath);
    //hly001->addWidget(pBtnSelect);
    //hly001->addWidget(pBtnOpen);
    //hly001->addWidget(pBtnClose);
    //hly001->addWidget(pComBox);
    //hly001->addWidget(pBtnShowDlg);
    //pCentrelWgt   = new QWidget(this);

    //QVBoxLayout *vly0010 = new QVBoxLayout(pCentrelWgt);
    //vly0010->addWidget(m_widget,1);

    //QVBoxLayout *vly010 = new QVBoxLayout(this);
    //vly010->addLayout(hly001);
    //vly010->addWidget(pCentrelWgt,1);


    /*m_widget = new QWidget(this);
    m_widget->setStyleSheet(QString("background-color: rgb(0, 0, 0);"));
    m_widget->setGeometry(0,0,1000,1000);
    m_widget->show();
    m_widget->setWindowOpacity(0.1);
    m_widget->installEventFilter(this);*/

    setAutoFillBackground(false);
    setAttribute(Qt::WA_TranslucentBackground, true);
    setWindowFlags(Qt::FramelessWindowHint); 
    installEventFilter(this);


    HWND wid = (HWND)(this->winId());
    //SetWindowLong(wid, GWL_EXSTYLE, GetWindowLong(wid, GWL_EXSTYLE) | WS_EX_NOACTIVATE | WS_EX_COMPOSITED); 
    SetWindowLong(wid, GWL_EXSTYLE, GetWindowLong(wid, GWL_EXSTYLE) | WS_EX_NOACTIVATE); 

    //HWND wid2 = (HWND)(m_widget->winId());
    //SetWindowLong(wid2, GWL_EXSTYLE, GetWindowLong(wid2, GWL_EXSTYLE) | WS_EX_NOACTIVATE | WS_EX_COMPOSITED); 


    //slideShowWindow  = static_cast<PowerPoint::SlideShowWindow*>(presentation->querySubObject("SlideShowWindow()"));
    //installEventFilter(this);
}

void DemoTestWidget::initConnect()
{
    BUTTON_ACT(pBtnOpen,sltBtnOpen());
    BUTTON_ACT(pBtnSelect,sltBtnSelect());
    BUTTON_ACT(pBtnClose,sltBtnClose());
    BUTTON_ACT(pBtnShowDlg,sltBtnShowDlg());
}


void DemoTestWidget::sltBtnOpen()
{
    /*QString strPath = pTxtPath->text();
    if (!strPath.isEmpty())
    {
        QVariant v(strPath);
        pOfficeContainer->Open(v);
    }*/
    qDebug() << "Btn Open";


    //test  
    //presentations->dynamicCall("Open(QString)", "C:\Users\LJ\Desktop\test.pptx");

    //test2
    //PowerPoint::Slides* slides = static_cast<PowerPoint::Slides*>(presentation->querySubObject("Slides()"));
    slideShowWindow  = static_cast<PowerPoint::SlideShowWindow*>(presentation->querySubObject("SlideShowWindow()"));
    slideShowView  = static_cast<PowerPoint::SlideShowView*>(slideShowWindow->querySubObject("View()"));

    //slideShowView.Next();
    slideShowView->dynamicCall("Next()");
    //slideShowView->dynamicCall("GotoSlide(int)", 4);
    m_index++;
    //slideShowView->dynamicCall("GotoClick(int)", PowerPoint::msoClickStateAfterAllAnimations);


    int sum = slideShowView->GetClickCount(); //当前页的动画个数
    /*QMessageBox msgBox;
    msgBox.setText(QString::number(sum));
    msgBox.exec();*/

}

void DemoTestWidget::sltBtnSelect()
{
    QString filePath = QFileDialog::getOpenFileName(this,tr("Select Word"),"",tr("Word (*.doc;*.docx;*.docm);;Excel (*.xls;*.xlsx;*.xlsm;*.xlsb);;PPT (*.ppt;*.pptx;*.pptm)"));
    if (filePath.isEmpty())
    {
        //emit sigUpdateMsg("未选择Word文件");
    }
    else
    {
        pTxtPath->setText(filePath);
    }
    qDebug() << "Btn Select";
}

void DemoTestWidget::sltBtnClose()
{
    pOfficeContainer->Close();
}

void DemoTestWidget::sltBtnShowDlg()
{
    int index = pComBox->currentIndex();

    pOfficeContainer->ShowDialog((OfficeContainer::DialogType)(index));
}

bool DemoTestWidget::eventFilter(QObject *target, QEvent *event)  
{  
    //if(target == m_widget)  
    {  
        qDebug("The imageWidget generate the event!");  
        if(event->type() == QEvent::MouseButtonPress)  
        {  
            QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);  
            if(mouseEvent->buttons() & Qt::LeftButton)  
            {  
                qDebug("The Left Button Event!"); 
                slideShowWindow  = static_cast<PowerPoint::SlideShowWindow*>(presentation->querySubObject("SlideShowWindow()"));
                slideShowView  = static_cast<PowerPoint::SlideShowView*>(slideShowWindow->querySubObject("View()"));

                SetCursorPos(500,0);//这个坐标是“开始”这个菜单在我当前电脑屏幕上的位置,大家可以自己去获取  
                mouse_event( MOUSEEVENTF_LEFTDOWN, 0,0,0,NULL);//鼠标down事件  
                mouse_event( MOUSEEVENTF_LEFTUP, 0,0,0,NULL);//鼠标up事件

                //QAxWidget* slideShowWindowWidget  = static_cast<QAxWidget*>(presentation->querySubObject("SlideShowWindow()"));
                //slideShowWindow->mousePressEvent( (QMouseEvent *)event); 

                //slideShowView.Next();
                //slideShowView->dynamicCall("Next()");

            }  
            return true;  
        } 

        /*switch (event->type())
        {
            case QEvent::KeyPress:
            {
                QKeyEvent *pKeyEvent = static_cast<QKeyEvent*>(event);
                if (pKeyEvent->key() == Qt::Key_Escape)
                {
                    return true;
                }
            }
        }*/

    }  

    //其它部件产生的事件则交给基类处理  
    return QWidget::eventFilter(target, event);  
}


void DemoTestWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.fillRect(this->rect(), QColor(0, 0, 255, 50));  //QColor最后一个参数80代表背景的透明度
}
#include <QtTest/QtTest> #include <QObject> #include <QApplication> #include <QWidget> #include <QPushButton> #include <QTableView> #include <QTextEdit> #include <QTimer> #include <QElapsedTimer> #include <QDir> #include <QFile> #include <QXmlStreamWriter> #include <QJsonDocument> #include <QJsonObject> #include <QJsonArray> #include <QDateTime> #include <functional> #include <memory> /** * @brief 增强的测试框架类 * * 功能特性: * - GUI应用程序自动化测试 * - 性能测试功能 * - XML输出支持,便于CI系统集成 * - 测试结果统计和报告 */ class EnhancedTestFramework : public QObject { Q_OBJECT public: struct TestResult { QString testName; bool passed; qint64 executionTime; // 毫秒 QString errorMessage; QString category; }; struct PerformanceMetrics { qint64 minTime; qint64 maxTime; qint64 avgTime; qint64 totalTime; int testCount; }; private slots: void initTestCase(); void cleanupTestCase(); void init(); void cleanup(); // GUI自动化测试 void testGUIAutomation(); void testWidgetInteraction(); void testButtonClicks(); void testTableOperations(); // 性能测试 void testPerformanceBasic(); void testPerformanceMemory(); void testPerformanceNetwork(); void testPerformanceBatch(); private: // 测试框架方法 void runGUITest(const QString& testName, std::function<void()> testFunc); void runPerformanceTest(const QString& testName, std::function<void()> testFunc, int iterations = 100); void generateXMLReport(); void generateJSONReport(); void measureMemoryUsage(); // GUI测试辅助方法 void simulateButtonClick(QPushButton* button); void simulateTableClick(QTableView* table, int row, int column); void waitForWidget(QWidget* widget, int timeout = 5000); bool verifyWidgetState(QWidget* widget, const QString& expectedState); // 性能测试辅助方法 qint64 measureExecutionTime(std::function<void()> func); void collectPerformanceMetrics(const QString& category); private: std::unique_ptr<QApplication> m_app; QList<TestResult> m_testResults; QMap<QString, PerformanceMetrics> m_performanceData; QElapsedTimer m_timer; QString m_outputDir; int m_testCounter; // GUI组件用于测试 std::unique_ptr<QWidget> m_testWidget; std::unique_ptr<QPushButton> m_testButton; std::unique_ptr<QTableView> m_testTable; std::unique_ptr<QTextEdit> m_testTextEdit; }; /** * @brief 测试套件初始化 */ void EnhancedTestFramework::initTestCase() { qDebug() << "开始增强测试框架套件"; m_testCounter = 0; // 创建输出目录 m_outputDir = QDir::current().absoluteFilePath("test_reports"); QDir().mkpath(m_outputDir); // 确保有QApplication实例 if (!QApplication::instance()) { int argc = 0; char** argv = nullptr; m_app = std::make_unique<QApplication>(argc, argv); } // 创建测试用的GUI组件 m_testWidget = std::make_unique<QWidget>(); m_testButton = std::make_unique<QPushButton>("Test Button", m_testWidget.get()); m_testTable = std::make_unique<QTableView>(m_testWidget.get()); m_testTextEdit = std::make_unique<QTextEdit>(m_testWidget.get()); // 设置测试组件的基本属性 m_testWidget->setWindowTitle("Test Widget"); m_testWidget->resize(800, 600); m_testButton->setGeometry(10, 10, 100, 30); m_testTable->setGeometry(10, 50, 300, 200); m_testTextEdit->setGeometry(10, 260, 300, 100); } /** * @brief 测试套件清理 */ void EnhancedTestFramework::cleanupTestCase() { qDebug() << "完成增强测试框架套件,共执行" << m_testCounter << "个测试"; // 生成测试报告 generateXMLReport(); generateJSONReport(); // 输出性能统计 for (auto it = m_performanceData.begin(); it != m_performanceData.end(); ++it) { const auto& metrics = it.value(); qDebug() << QString("性能统计 [%1]: 平均%2ms, 最小%3ms, 最大%4ms, 总计%5ms") .arg(it.key()) .arg(metrics.avgTime) .arg(metrics.minTime) .arg(metrics.maxTime) .arg(metrics.totalTime); } } /** * @brief 每个测试用例前的初始化 */ void EnhancedTestFramework::init() { m_testCounter++; m_timer.start(); } /** * @brief 每个测试用例后的清理 */ void EnhancedTestFramework::cleanup() { // 记录测试执行时间 qint64 elapsed = m_timer.elapsed(); qDebug() << QString("测试用例执行时间: %1ms").arg(elapsed); } /** * @brief GUI自动化测试 */ void EnhancedTestFramework::testGUIAutomation() { runGUITest("GUI自动化基础测试", [this]() { // 显示测试窗口 m_testWidget->show(); // 等待窗口显示 waitForWidget(m_testWidget.get()); // 验证窗口状态 QVERIFY(m_testWidget->isVisible()); QVERIFY(m_testWidget->isEnabled()); // 测试窗口标题 QCOMPARE(m_testWidget->windowTitle(), QString("Test Widget")); // 隐藏窗口 m_testWidget->hide(); QVERIFY(!m_testWidget->isVisible()); }); } /** * @brief 测试组件交互 */ void EnhancedTestFramework::testWidgetInteraction() { runGUITest("组件交互测试", [this]() { m_testWidget->show(); waitForWidget(m_testWidget.get()); // 测试按钮交互 QVERIFY(m_testButton->isEnabled()); simulateButtonClick(m_testButton.get()); // 测试文本编辑器 m_testTextEdit->setText("Test Content"); QCOMPARE(m_testTextEdit->toPlainText(), QString("Test Content")); // 测试表格视图 QVERIFY(m_testTable->isVisible()); m_testWidget->hide(); }); } /** * @brief 测试按钮点击 */ void EnhancedTestFramework::testButtonClicks() { runGUITest("按钮点击测试", [this]() { m_testWidget->show(); waitForWidget(m_testWidget.get()); // 测试多次点击 for (int i = 0; i < 5; ++i) { simulateButtonClick(m_testButton.get()); QTest::qWait(10); // 短暂等待 } // 测试按钮状态变化 m_testButton->setEnabled(false); QVERIFY(!m_testButton->isEnabled()); m_testButton->setEnabled(true); QVERIFY(m_testButton->isEnabled()); m_testWidget->hide(); }); } /** * @brief 测试表格操作 */ void EnhancedTestFramework::testTableOperations() { runGUITest("表格操作测试", [this]() { m_testWidget->show(); waitForWidget(m_testWidget.get()); // 测试表格基本属性 QVERIFY(m_testTable->isVisible()); QVERIFY(m_testTable->isEnabled()); // 模拟表格点击(如果有模型的话) if (m_testTable->model()) { simulateTableClick(m_testTable.get(), 0, 0); } m_testWidget->hide(); }); } /** * @brief 基础性能测试 */ void EnhancedTestFramework::testPerformanceBasic() { runPerformanceTest("基础操作性能", [this]() { // 测试字符串操作性能 QString result; for (int i = 0; i < 1000; ++i) { result += QString::number(i); } QVERIFY(!result.isEmpty()); }, 50); } /** * @brief 内存性能测试 */ void EnhancedTestFramework::testPerformanceMemory() { runPerformanceTest("内存分配性能", [this]() { // 测试内存分配和释放 QList<std::unique_ptr<QObject>> objects; for (int i = 0; i < 100; ++i) { objects.append(std::make_unique<QObject>()); } objects.clear(); }, 30); } /** * @brief 网络性能测试 */ void EnhancedTestFramework::testPerformanceNetwork() { runPerformanceTest("网络操作性能", [this]() { // 模拟网络操作(这里只是模拟延时) QTest::qWait(1); // 1ms延时模拟网络操作 QVERIFY(true); }, 20); } /** * @brief 批处理性能测试 */ void EnhancedTestFramework::testPerformanceBatch() { runPerformanceTest("批处理性能", [this]() { // 测试批量数据处理 QList<int> data; for (int i = 0; i < 1000; ++i) { data.append(i * 2); } int sum = 0; for (int value : data) { sum += value; } QVERIFY(sum > 0); }, 25); } /** * @brief 运行GUI测试 */ void EnhancedTestFramework::runGUITest(const QString& testName, std::function<void()> testFunc) { QElapsedTimer timer; timer.start(); TestResult result; result.testName = testName; result.category = "GUI"; try { testFunc(); result.passed = true; result.errorMessage = ""; } catch (const std::exception& e) { result.passed = false; result.errorMessage = e.what(); } catch (...) { result.passed = false; result.errorMessage = "未知异常"; } result.executionTime = timer.elapsed(); m_testResults.append(result); qDebug() << QString("GUI测试 [%1]: %2 (%3ms)") .arg(testName) .arg(result.passed ? "通过" : "失败") .arg(result.executionTime); } /** * @brief 运行性能测试 */ void EnhancedTestFramework::runPerformanceTest(const QString& testName, std::function<void()> testFunc, int iterations) { QList<qint64> times; for (int i = 0; i < iterations; ++i) { qint64 time = measureExecutionTime(testFunc); times.append(time); } // 计算性能指标 PerformanceMetrics metrics; metrics.testCount = iterations; metrics.totalTime = 0; metrics.minTime = times.first(); metrics.maxTime = times.first(); for (qint64 time : times) { metrics.totalTime += time; if (time < metrics.minTime) metrics.minTime = time; if (time > metrics.maxTime) metrics.maxTime = time; } metrics.avgTime = metrics.totalTime / iterations; m_performanceData[testName] = metrics; // 记录测试结果 TestResult result; result.testName = testName; result.category = "Performance"; result.passed = true; result.executionTime = metrics.avgTime; result.errorMessage = ""; m_testResults.append(result); qDebug() << QString("性能测试 [%1]: 平均%2ms, 最小%3ms, 最大%4ms") .arg(testName) .arg(metrics.avgTime) .arg(metrics.minTime) .arg(metrics.maxTime); } /** * @brief 生成XML测试报告 */ void EnhancedTestFramework::generateXMLReport() { QString xmlFile = QDir(m_outputDir).absoluteFilePath("test_results.xml"); QFile file(xmlFile); if (!file.open(QIODevice::WriteOnly)) { qWarning() << "无法创建XML报告文件:" << xmlFile; return; } QXmlStreamWriter xml(&file); xml.setAutoFormatting(true); xml.writeStartDocument(); xml.writeStartElement("testsuites"); xml.writeAttribute("name", "AumoFIS Enhanced Test Suite"); xml.writeAttribute("tests", QString::number(m_testResults.size())); int passed = 0; int failed = 0; qint64 totalTime = 0; for (const auto& result : m_testResults) { if (result.passed) passed++; else failed++; totalTime += result.executionTime; } xml.writeAttribute("failures", QString::number(failed)); xml.writeAttribute("time", QString::number(totalTime / 1000.0, 'f', 3)); // 按类别分组测试 QMap<QString, QList<TestResult>> categorizedTests; for (const auto& result : m_testResults) { categorizedTests[result.category].append(result); } for (auto it = categorizedTests.begin(); it != categorizedTests.end(); ++it) { xml.writeStartElement("testsuite"); xml.writeAttribute("name", it.key()); xml.writeAttribute("tests", QString::number(it.value().size())); int categoryPassed = 0; int categoryFailed = 0; qint64 categoryTime = 0; for (const auto& result : it.value()) { if (result.passed) categoryPassed++; else categoryFailed++; categoryTime += result.executionTime; xml.writeStartElement("testcase"); xml.writeAttribute("name", result.testName); xml.writeAttribute("time", QString::number(result.executionTime / 1000.0, 'f', 3)); if (!result.passed) { xml.writeStartElement("failure"); xml.writeAttribute("message", result.errorMessage); xml.writeCharacters(result.errorMessage); xml.writeEndElement(); // failure } xml.writeEndElement(); // testcase } xml.writeAttribute("failures", QString::number(categoryFailed)); xml.writeAttribute("time", QString::number(categoryTime / 1000.0, 'f', 3)); xml.writeEndElement(); // testsuite } xml.writeEndElement(); // testsuites xml.writeEndDocument(); qDebug() << "XML报告已生成:" << xmlFile; } /** * @brief 生成JSON测试报告 */ void EnhancedTestFramework::generateJSONReport() { QString jsonFile = QDir(m_outputDir).absoluteFilePath("test_results.json"); QFile file(jsonFile); if (!file.open(QIODevice::WriteOnly)) { qWarning() << "无法创建JSON报告文件:" << jsonFile; return; } QJsonObject root; root["framework"] = "AumoFIS Enhanced Test Framework"; root["timestamp"] = QDateTime::currentDateTime().toString(Qt::ISODate); root["total_tests"] = m_testResults.size(); int passed = 0; int failed = 0; for (const auto& result : m_testResults) { if (result.passed) passed++; else failed++; } root["passed"] = passed; root["failed"] = failed; root["success_rate"] = QString::number((double)passed / m_testResults.size() * 100, 'f', 2); // 测试结果 QJsonArray testsArray; for (const auto& result : m_testResults) { QJsonObject testObj; testObj["name"] = result.testName; testObj["category"] = result.category; testObj["passed"] = result.passed; testObj["execution_time_ms"] = result.executionTime; testObj["error_message"] = result.errorMessage; testsArray.append(testObj); } root["tests"] = testsArray; // 性能数据 QJsonObject performanceObj; for (auto it = m_performanceData.begin(); it != m_performanceData.end(); ++it) { QJsonObject metricsObj; const auto& metrics = it.value(); metricsObj["min_time_ms"] = metrics.minTime; metricsObj["max_time_ms"] = metrics.maxTime; metricsObj["avg_time_ms"] = metrics.avgTime; metricsObj["total_time_ms"] = metrics.totalTime; metricsObj["test_count"] = metrics.testCount; performanceObj[it.key()] = metricsObj; } root["performance"] = performanceObj; QJsonDocument doc(root); file.write(doc.toJson()); qDebug() << "JSON报告已生成:" << jsonFile; } /** * @brief 模拟按钮点击 */ void EnhancedTestFramework::simulateButtonClick(QPushButton* button) { if (!button) return; QTest::mouseClick(button, Qt::LeftButton); QTest::qWait(10); // 短暂等待 } /** * @brief 模拟表格点击 */ void EnhancedTestFramework::simulateTableClick(QTableView* table, int row, int column) { if (!table || !table->model()) return; QModelIndex index = table->model()->index(row, column); if (index.isValid()) { table->setCurrentIndex(index); QTest::mouseClick(table->viewport(), Qt::LeftButton, Qt::NoModifier, table->visualRect(index).center()); } } /** * @brief 等待组件显示 */ void EnhancedTestFramework::waitForWidget(QWidget* widget, int timeout) { if (!widget) return; QElapsedTimer timer; timer.start(); while (!widget->isVisible() && timer.elapsed() < timeout) { QTest::qWait(10); } } /** * @brief 测量执行时间 */ qint64 EnhancedTestFramework::measureExecutionTime(std::function<void()> func) { QElapsedTimer timer; timer.start(); func(); return timer.elapsed(); } QTEST_MAIN(EnhancedTestFramework) #include "test_framework_enhanced.moc"
05-28
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值