From 2b4f2ba4565dba2f40944093efa62d188eeeeca0 Mon Sep 17 00:00:00 2001 From: liuxing Date: Thu, 19 Nov 2020 18:11:06 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BB=BB=E5=8A=A1=E6=A0=8Fgtest?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95=E6=A1=86=E6=9E=B6=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 任务栏gtest单元测试框架添加 Log: 任务栏gtest单元测试框架添加 Task: https://pms.uniontech.com/zentao/task-view-44498.html Change-Id: Ifaf67e4d019c21bd00af6645deeb57a81b343afb --- debian/control | 3 +- gen_report.sh | 17 +++++++ unittest/CMakeLists.txt | 10 +++- unittest/dock_unit_test.cpp | 94 +++++++++++++++++++------------------ unittest/dock_unit_test.h | 28 +++-------- unittest/main.cpp | 11 +++++ 6 files changed, 94 insertions(+), 69 deletions(-) create mode 100755 gen_report.sh create mode 100644 unittest/main.cpp diff --git a/debian/control b/debian/control index 3adf0b0b4..2563d2216 100644 --- a/debian/control +++ b/debian/control @@ -23,7 +23,8 @@ Build-Depends: debhelper (>= 8.0.0), cmake, libdde-network-utils-dev, libdbusmenu-qt5-dev, - libdtkgui-dev + libdtkgui-dev, + libgtest-dev Standards-Version: 3.9.8 Homepage: http://www.deepin.org/ diff --git a/gen_report.sh b/gen_report.sh new file mode 100755 index 000000000..9dbd2bea4 --- /dev/null +++ b/gen_report.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +# 需要先安装lcov,打开./unittest/CMakeLists.txt 测试覆盖率的编译条件 +# 将该脚本放置到dde-dock-unit_test二进制文件同级目录运行 +lcov -c -i -d ./ -o init.info +./dde_dock_unit_test +lcov -c -d ./ -o cover.info +lcov -a init.info -a cover.info -o total.info +lcov --remove total.info '*/usr/include/*' '*/usr/lib/*' '*/usr/lib64/*' '*/usr/local/include/*' '*/usr/local/lib/*' '*/usr/local/lib64/*' '*/third/*' 'testa.cpp' -o final.info + +# 生成报告 +genhtml -o cover_report --legend --title "lcov" --prefix=./ final.info + +#打开报告 +nohup x-www-browser ./cover_report/index.html & + +exit 0 diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index 46622b12b..0e41847e8 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -8,9 +8,13 @@ set(CMAKE_AUTOMOC ON) # 源文件 file(GLOB_RECURSE SRCS "*.h" "*.cpp") +# 用于测试覆盖率的编译条件 +#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage -lgcov") + # 查找依赖库 find_package(PkgConfig REQUIRED) -find_package(Qt5 COMPONENTS Test DBus REQUIRED) +find_package(Qt5 COMPONENTS Widgets Test DBus REQUIRED) +find_package(GTest REQUIRED) pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus) pkg_check_modules(QGSettings REQUIRED gsettings-qt) @@ -27,4 +31,8 @@ target_link_libraries(${BIN_NAME} PRIVATE ${Qt5DBus_LIBRARIES} ${DFrameworkDBus_LIBRARIES} ${QGSettings_LIBRARIES} + ${Qt5Widgets_LIBRARIES} + ${GTEST_LIBRARIES} + -lpthread + -lm ) diff --git a/unittest/dock_unit_test.cpp b/unittest/dock_unit_test.cpp index f690062bc..7018f8a09 100644 --- a/unittest/dock_unit_test.cpp +++ b/unittest/dock_unit_test.cpp @@ -35,16 +35,20 @@ #define SLEEP1 QThread::sleep(1); DockUnitTest::DockUnitTest() - : m_dockInter(new QDBusInterface("com.deepin.dde.Dock", "/com/deepin/dde/Dock", "org.freedesktop.DBus.Properties")) - , m_daemonDockInter(new DBusDock("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this)) { qDBusRegisterMetaType(); } DockUnitTest::~DockUnitTest() { - delete m_dockInter; - delete m_daemonDockInter; +} + +void DockUnitTest::SetUp() +{ +} + +void DockUnitTest::TearDown() +{ } const DockRect DockUnitTest::dockGeometry() @@ -72,7 +76,8 @@ const DockRect DockUnitTest::frontendWindowRect() void DockUnitTest::setPosition(Dock::Position pos) { - m_daemonDockInter->setPosition(pos); + DBusDock daemonDockInter("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this); + daemonDockInter.setPosition(pos); } /** @@ -83,31 +88,31 @@ void DockUnitTest::setPosition(Dock::Position pos) * 2.任务栏默认显示状态。 * 3.任务栏默认位置。 */ -void DockUnitTest::dock_defaultGsettings_check() +TEST_F(DockUnitTest, dock_defaultGsettings_check) { QGSettings setting("com.deepin.dde.dock", "/com/deepin/dde/dock/"); if (setting.keys().contains("displayMode")) { QString currentDisplayMode = setting.get("display-mode").toString(); QString defaultDisplayMode = "efficient"; - QCOMPARE(currentDisplayMode, defaultDisplayMode); + ASSERT_EQ(currentDisplayMode, defaultDisplayMode); } if (setting.keys().contains("hideMode")) { QString currentHideMode = setting.get("hide-mode").toString(); QString defaultHideMode = "keep-showing"; - QCOMPARE(currentHideMode, defaultHideMode); + ASSERT_EQ(currentHideMode, defaultHideMode); } if (setting.keys().contains("position")) { QString currentPosition = setting.get("position").toString(); QString defaultPosition = "bottom"; - QCOMPARE(currentPosition, defaultPosition); + ASSERT_EQ(currentPosition, defaultPosition); } } /** * @brief DockUnitTest::dock_geometry_test 比较任务栏自身的位置和通知给后端的位置是否吻合 */ -void DockUnitTest::dock_geometry_check() +TEST_F(DockUnitTest, dock_geometry_check) { ScreenRect daemonDockRect, dockRect; @@ -141,12 +146,12 @@ void DockUnitTest::dock_geometry_check() qDebug() << dockRect; } - QCOMPARE(daemonDockRect, dockRect); + ASSERT_EQ(daemonDockRect, dockRect); } /** * @brief DockUnitTest::dock_position_check 比较Dbus和QGSettings获取的坐标信息是否一致 */ -void DockUnitTest::dock_position_check() +TEST_F(DockUnitTest, dock_position_check) { DBusDock *dockInter = new DBusDock("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this); int nPos = dockInter->position(); @@ -173,13 +178,13 @@ void DockUnitTest::dock_position_check() QGSettings *setting = new QGSettings("com.deepin.dde.dock"); if (setting->keys().contains("position")) { qDebug() << setting->get("position"); - QCOMPARE(postion,setting->get("position").toString()); + ASSERT_EQ(postion, setting->get("position").toString()); } } /** * @brief DockUnitTest::dock_displayMode_check 比较Dbus和QGSettings获取的显示模式是否一致 */ -void DockUnitTest::dock_displayMode_check() +TEST_F(DockUnitTest, dock_displayMode_check) { DBusDock *dockInter = new DBusDock("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this); int nMode = dockInter->displayMode(); @@ -203,11 +208,11 @@ void DockUnitTest::dock_displayMode_check() QGSettings *setting = new QGSettings("com.deepin.dde.dock"); if (setting->keys().contains("displayMode")) { qDebug() << setting->get("displayMode"); - QCOMPARE(displayMode,setting->get("displayMode").toString()); + ASSERT_EQ(displayMode, setting->get("displayMode").toString()); } } -void DockUnitTest::dock_appItemCount_check() +TEST_F(DockUnitTest, dock_appItemCount_check) { DBusDock *dockInter = new DBusDock("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this); qDebug() << dockInter->entries().size(); @@ -224,36 +229,36 @@ void DockUnitTest::dock_appItemCount_check() * 可测出问题:任务栏在5.3.0.2版本时,开启缩放后,启动器打开时位置和任务栏有重叠,5.3.0.5版本修复了这个问题 * 对应Bug: https://pms.uniontech.com/zentao/bug-view-42095.html */ -void DockUnitTest::dock_frontWindowRect_check() +TEST_F(DockUnitTest, dock_frontWindowRect_check) { setPosition(Dock::Position::Top); SLEEP1; - QVERIFY(dockGeometry() == frontendWindowRect()); + ASSERT_EQ(dockGeometry(), frontendWindowRect()); setPosition(Dock::Position::Right); SLEEP1; - QVERIFY(dockGeometry() == frontendWindowRect()); + ASSERT_EQ(dockGeometry(), frontendWindowRect()); setPosition(Dock::Position::Bottom); SLEEP1; - QVERIFY(dockGeometry() == frontendWindowRect()); + ASSERT_EQ(dockGeometry(), frontendWindowRect()); setPosition(Dock::Position::Left); SLEEP1; - QVERIFY(dockGeometry() == frontendWindowRect()); + ASSERT_EQ(dockGeometry(), frontendWindowRect()); } /** * @brief DockUnitTest::dock_multi_process * 检查dde-dock是否在没进程存在时能否正常启动,在已有dde-dock进程存在时能否正常退出 */ -void DockUnitTest::dock_multi_process() +TEST_F(DockUnitTest, dock_multi_process) { QProcess *dockProc = new QProcess(); dockProc->start("dde-dock"); connect(dockProc, static_cast(&QProcess::finished), this, [=](int exitCode, QProcess::ExitStatus exitStatus) { - QCOMPARE(exitCode, 255); - QCOMPARE(exitStatus, QProcess::ExitStatus::NormalExit); + ASSERT_EQ(exitCode, 255); + ASSERT_EQ(exitStatus, QProcess::ExitStatus::NormalExit); }); connect(dockProc, &QProcess::errorOccurred, this, [=](QProcess::ProcessError error) { qDebug() << "dde-dock error occurred: " << error; @@ -270,7 +275,7 @@ void DockUnitTest::dock_multi_process() * 运行此用例时需满足用户未手动修改过声音值这一条件,才能保证得到的是默认值,测试才能通过 * 所以最好在新创建的用户,或者是新装的系统时进行测试 */ -void DockUnitTest::dock_defaultVolume_Check(float defaultVolume) +TEST_F(DockUnitTest, dock_defaultVolume_Check) { float volume = 0; QDBusInterface audioInterface("com.deepin.daemon.Audio", "/com/deepin/daemon/Audio", "com.deepin.daemon.Audio", QDBusConnection::sessionBus(), this); @@ -282,14 +287,14 @@ void DockUnitTest::dock_defaultVolume_Check(float defaultVolume) QDBusInterface sinkInterface("com.deepin.daemon.Audio", defaultPath.path(), "com.deepin.daemon.Audio.Sink", QDBusConnection::sessionBus(), this); volume = sinkInterface.property("Volume").toFloat() * 100.0f; } - QCOMPARE(volume, defaultVolume); + ASSERT_EQ(volume, 50.0f); } /** * @brief DockUnitTest::dock_coreDump_check * 间隔一段时间判断dock是不是同一个pid,判断是否一直在崩溃 * */ -void DockUnitTest::dock_coreDump_check() +TEST_F(DockUnitTest, dock_coreDump_check) { auto process = new QProcess(); process->start("pidof -s dde-dock"); @@ -304,7 +309,7 @@ void DockUnitTest::dock_coreDump_check() QByteArray pid2 = process->readAllStandardOutput(); process->close(); - QCOMPARE(pid,pid2); + ASSERT_EQ(pid, pid2); delete process; } @@ -313,20 +318,20 @@ void DockUnitTest::dock_coreDump_check() * @brief DockUnitTest::dock_appIconSize_check * 判断dbus和gsettings获取的任务栏图标大小是否一致 */ -void DockUnitTest::dock_appIconSize_check() +TEST_F(DockUnitTest, dock_appIconSize_check) { DBusDock *dockInter = new DBusDock("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this); QGSettings *setting = new QGSettings("com.deepin.dde.dock"); unsigned int iconSize = dockInter->iconSize(); qDebug() << "Please check the size of icons:" << iconSize; - QCOMPARE(iconSize, setting->get("icon-size").toUInt()); + ASSERT_EQ(iconSize, setting->get("icon-size").toUInt()); } /** * @brief dock_appDockUndock_check * 取靠近启动器的应用区域的第一个应用,先 undock ,然后 dock 进行检测 */ -void DockUnitTest::dock_appDockUndock_check() +TEST_F(DockUnitTest, dock_appDockUndock_check) { const QString service_name = "com.deepin.dde.daemon.Dock"; const QString dock_path = "/com/deepin/dde/daemon/Dock"; @@ -346,8 +351,8 @@ void DockUnitTest::dock_appDockUndock_check() const QString appDockPath = appEntries[appIndex].path(); // get DesktopFile - QDBusInterface appPropertyInter(service_name,appDockPath, "org.freedesktop.DBus.Properties", QDBusConnection::sessionBus(), this); - QDBusInterface appSlotInter(service_name,appDockPath, "com.deepin.dde.daemon.Dock.Entry", QDBusConnection::sessionBus(), this); + QDBusInterface appPropertyInter(service_name, appDockPath, "org.freedesktop.DBus.Properties", QDBusConnection::sessionBus(), this); + QDBusInterface appSlotInter(service_name, appDockPath, "com.deepin.dde.daemon.Dock.Entry", QDBusConnection::sessionBus(), this); QDBusReply replyDesktopFile = appPropertyInter.call("Get", "com.deepin.dde.daemon.Dock.Entry", "DesktopFile"); QString desktopFile = QVariant(replyDesktopFile).toString(); // desktopFile @@ -361,14 +366,14 @@ void DockUnitTest::dock_appDockUndock_check() // check if app still dock appDesktopFiles=dockInter.GetDockedAppsDesktopFiles(); - QCOMPARE(appDesktopFiles.contains(desktopFile), false); + ASSERT_EQ(appDesktopFiles.contains(desktopFile), false); // dock app dockInter.RequestDock(desktopFile, appIndex); QThread::msleep(100); // must // check if app is docked - QCOMPARE(dockInter.IsDocked(desktopFile), true); + ASSERT_EQ(dockInter.IsDocked(desktopFile), true); } /** @@ -376,7 +381,7 @@ void DockUnitTest::dock_appDockUndock_check() * 检查智能模式时,切换任务栏显示模式,任务栏状态 * 可以检测桌面无窗口,切换为智能隐藏模式后任务栏隐藏问题 41907 */ -void DockUnitTest::dock_switchModeState_check() +TEST_F(DockUnitTest, dock_switchModeState_check) { QProcess process; process.start("/usr/lib/deepin-daemon/desktop-toggle"); @@ -386,17 +391,14 @@ void DockUnitTest::dock_switchModeState_check() return; } - m_daemonDockInter->setSync(true); - m_daemonDockInter->setHideMode(Dock::HideMode::SmartHide); - m_daemonDockInter->setDisplayMode(Dock::DisplayMode::Fashion); - m_daemonDockInter->setDisplayMode(Dock::DisplayMode::Efficient); + DBusDock daemonDockInter("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this); + daemonDockInter.setSync(true); + daemonDockInter.setHideMode(Dock::HideMode::SmartHide); + daemonDockInter.setDisplayMode(Dock::DisplayMode::Fashion); + daemonDockInter.setDisplayMode(Dock::DisplayMode::Efficient); QThread::sleep(2); - int state = m_daemonDockInter->hideState(); + int state = daemonDockInter.hideState(); - QCOMPARE(state, Dock::HideState::Show); + ASSERT_EQ(state, Dock::HideState::Show); } - -QTEST_APPLESS_MAIN(DockUnitTest) - -#include "dock_unit_test.moc" diff --git a/unittest/dock_unit_test.h b/unittest/dock_unit_test.h index 8f5f087aa..ed4fd3d96 100644 --- a/unittest/dock_unit_test.h +++ b/unittest/dock_unit_test.h @@ -26,38 +26,24 @@ #include "../interfaces/constants.h" +#include + using DBusDock = com::deepin::dde::daemon::Dock; -class DockUnitTest : public QObject +class DockUnitTest : public QObject, public ::testing::Test { Q_OBJECT public: DockUnitTest(); - ~DockUnitTest(); + virtual ~DockUnitTest(); + virtual void SetUp(); + virtual void TearDown(); -private: - QDBusInterface *m_dockInter; - DBusDock *m_daemonDockInter; - -private: +public: const DockRect dockGeometry(); // 获取任务栏实际位置 const DockRect frontendWindowRect(); // 后端记录的任务栏前端界面位置(和实际位置不一定对应) void setPosition(Dock::Position pos); - -private slots: - void dock_defaultGsettings_check(); // 默认配置项检查 - void dock_geometry_check(); // 显示区域 - void dock_position_check(); // 位置检查 - void dock_displayMode_check(); // 显示模式检查 - void dock_appItemCount_check(); // 应用显示数量检查 - void dock_defaultVolume_Check(float defaultVolume = 50.0f); // 设备默认音量检查 - void dock_frontWindowRect_check(); // 检查FrontendWindowRect接口数据是否正确 - void dock_multi_process(); // 检查是否正常启动 - void dock_coreDump_check(); // dock是否一直崩溃 - void dock_appIconSize_check(); // 图标大小检查 - void dock_appDockUndock_check(); // 任务栏上的应用移除和加载检测 - void dock_switchModeState_check(); // 显示桌面智能隐藏时切换任务栏模式,检查任务栏状态 }; #endif // DOCK_UNIT_TEST_H diff --git a/unittest/main.cpp b/unittest/main.cpp new file mode 100644 index 000000000..2e76e6638 --- /dev/null +++ b/unittest/main.cpp @@ -0,0 +1,11 @@ +#include +#include + +int main(int argc, char **argv) +{ + QApplication app(argc, argv); + + testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +}