feat: 任务栏gtest单元测试框架添加

任务栏gtest单元测试框架添加

Log: 任务栏gtest单元测试框架添加
Task: https://pms.uniontech.com/zentao/task-view-44498.html
Change-Id: Ifaf67e4d019c21bd00af6645deeb57a81b343afb
This commit is contained in:
liuxing 2020-11-19 18:11:06 +08:00
parent a19ecbe757
commit 2b4f2ba456
6 changed files with 94 additions and 69 deletions

3
debian/control vendored
View File

@ -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/

17
gen_report.sh Executable file
View File

@ -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

View File

@ -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
)

View File

@ -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<ScreenRect>();
}
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.25.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<void (QProcess::*)(int, QProcess::ExitStatus)>(&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<QVariant> 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"

View File

@ -26,38 +26,24 @@
#include "../interfaces/constants.h"
#include <gtest/gtest.h>
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

11
unittest/main.cpp Normal file
View File

@ -0,0 +1,11 @@
#include <QApplication>
#include <gtest/gtest.h>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}