概述
目录文件分析
audiopolicymanager_tests.cpp源码位于frameworks/av/services/audiopolicy/tests目录中;
该测试程序的目录树如下:
Andriod.mk为该测试程序的Makefile。
audiopolicymanager_tests.cpp为测试程序,主要使用gtest框架。
AudioPolicyTestClient.h定义了AudioPolicyClientInterface的派生类,作为Client用于AudioPolicy与AudioFlinger之间的通信。
AudioPolicyTestManager.h定义了AudioPolicyManager的派生类,主要用于管理AudioPolicy的事务。
分析audiopolicymanager_tests的gtest流程
文中使用了gtest框架中的两个测试接口来实现测试,分别是TEST与TEST_F。通过分析TEST的fixture_class是Test,而TEST_F的fixture_class则是继承于TEST的派生类。比如audiopolicymanager_tests的TEST_F指定的fixture_class是AudioPolicyManagerTest。
TEST分析
audiopolicymanager_tests.cpp代码如下:
TEST(AudioPolicyManagerTestInit, Failure) {
AudioPolicyTestClient client;
AudioPolicyTestManager manager(&client);
manager.getConfig().setDefault();
// Since the default client fails to open anything,
// APM should indicate that the initialization didn't succeed.
ASSERT_EQ(NO_INIT, manager.initialize());
ASSERT_EQ(NO_INIT, manager.initCheck());
}
TEST在gtest中被指定为一个宏,该宏通过传入的参数,来在内部创建一个继承于using testing::Test派生类。下面简单分析该派生类的创建过程。
1. 在gtest/gtest.h中定义的TEST宏指向于GTEST_TEST_。
#define GTEST_TEST(test_suite_name, test_name)
GTEST_TEST_(test_suite_name, test_name, ::testing::Test,
::testing::internal::GetTestTypeId())
// Define this macro to 1 to omit the definition of TEST(), which
// is a generic name and clashes with some other libraries.
#if !GTEST_DONT_DEFINE_TEST
#define TEST(test_suite_name, test_name) GTEST_TEST(test_suite_name, test_name)
#endif
2. GTEST_TEST_宏定义在gtest-internal.h中,其中TestBody()的实现audiopolicymanager_tests.cpp的TEST后面定义。
// Expands to the name of the class that implements the given test.
#define GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)
test_suite_name##_##test_name##_Test
// Helper macro for defining tests.
#define GTEST_TEST_(test_suite_name, test_name, parent_class, parent_id)
static_assert(sizeof(GTEST_STRINGIFY_(test_suite_name)) > 1,
"test_suite_name must not be empty");
static_assert(sizeof(GTEST_STRINGIFY_(test_name)) > 1,
"test_name must not be empty");
class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)
: public parent_class {
public:
GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {}
~GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() override = default;
GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name,
test_name));
GTEST_DISALLOW_MOVE_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name,
test_name));
private:
void TestBody() override;
static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;
};
::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_suite_name,
test_name)::test_info_ =
::testing::internal::MakeAndRegisterTestInfo(
#test_suite_name, #test_name, nullptr, nullptr,
::testing::internal::CodeLocation(__FILE__, __LINE__), (parent_id),
::testing::internal::SuiteApiResolver<
parent_class>::GetSetUpCaseOrSuite(__FILE__, __LINE__),
::testing::internal::SuiteApiResolver<
parent_class>::GetTearDownCaseOrSuite(__FILE__, __LINE__),
new ::testing::internal::TestFactoryImpl<GTEST_TEST_CLASS_NAME_(
test_suite_name, test_name)>);
void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody()
3. 当类创建完之后,会初始化静态成员变量test_info_,最终通过调用::testing::internal::MakeAndRegisterTestInfo方法
创建一个TestInfo示例和一个TestSuite实例,并将新创建的TestSuite添加到internal::UnitTestImpl::test_suites_中,将TestInfo添加到TestSuite实例中。此处代码略。
TEST_F分析
1. 在gtest/gtest.h中定义的TEST_F宏指向于GTEST_TEST_。
#if !GTEST_DONT_DEFINE_TEST
#define TEST_F(test_fixture, test_name)
GTEST_TEST_(test_fixture, test_name, test_fixture,
::testing::internal::GetTypeId<test_fixture>())
#endif // !GTEST_DONT_DEFINE_TEST
2. 创建测试组件类的方法与TEST中的方法一样,都是通过调用::testing::internal::MakeAndRegisterTestInfo方法来实现的。只不过此创建的组件类父类不再是::testing::Test了,而是::testing::Test的派生类。
3. audiopolicymanager_tests.cpp文件中::testing::Test的派生类为AudioPolicyManagerTest。该测试类的定义如下:
class AudioPolicyManagerTest : public testing::Test {
protected:
virtual void SetUp();
virtual void TearDown();
std::unique_ptr<AudioPolicyManagerTestClient> mClient;
std::unique_ptr<AudioPolicyTestManager> mManager;
};
该类实现了父类定义的SetUp和TearDown函数,这两个方法定义了该组件类在RUN_ALL_TESTS()时分别安装与卸载私有资源。例如:
void AudioPolicyManagerTest::SetUp() {
mClient.reset(new AudioPolicyManagerTestClient);
mManager.reset(new AudioPolicyTestManager(mClient.get()));
mManager->getConfig().setDefault();
ASSERT_EQ(NO_ERROR, mManager->initialize());
ASSERT_EQ(NO_ERROR, mManager->initCheck());
}
void AudioPolicyManagerTest::TearDown() {
mManager.reset();
mClient.reset();
}
程序流程
通过在测试文件中定义TEST或者TEST_F功能块,在程序运行时创建TEST和TEST_F指定的测试类,程序会调用testing::InitGoogleTest(&argc, argv)来进行环境变量的初始化,最终执行RUN_ALL_TESTS()进行测试类的创建,接着调用上文指定的setup()函数进行配置,并执行测试类的TestBody()函数来进行测试,完成之后TearDown()来回收资源。
总结
通过分析TEST与TEST_F宏,有下面的总结:
- TEST或者TEST_F后面必须跟测试功能块,该测试功能块是最终的测试TestBody();
- 使用TEST_F需要定义测试组件类,该类必须继承于testing::Test类;
最后
以上就是追寻裙子为你收集整理的audiopolicymanager_tests流程分析gtest测试程序基本流程目录文件分析分析audiopolicymanager_tests的gtest流程的全部内容,希望文章能够帮你解决audiopolicymanager_tests流程分析gtest测试程序基本流程目录文件分析分析audiopolicymanager_tests的gtest流程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复