导读:TDD(Test Driven Development)是一种强调测试先行的开发方式,通过编写单元测试用例,有效保障存量复杂系统在开发、重构上的质量。在本文中,高德智能技术中心的同学通过分析现有测试方法面临的问题,分享如何使用GTest框架进行单元测试,以及在单元测试中的一些实践心得。
无效diff问题:以公交规划引擎为例,依赖步导引擎、搜索、公交突发事件、路况等多个下游服务,获取结果的差异导致很多无效diff。
运行时间较长:case量较多时运行时间较长,在10分钟级别。由于这一步成本较高,一般开发人员跑diff的频率不会太高,无法进行"每次一小步"的测试。
排查困难:当发现diff后进行排查非常困难,因为是整个请求级别的diff,中间步骤可能都存在问题。
int RCUnitTest::Excute()
{
int argc = 2;
char* argv[] = {const_cast<char*>(""), const_cast<char*>("--gtest_output=\"xml:./testAll.xml\"")};
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
class DateTimeUtilTest : public ::testing::Test
{
protected:
virtual void SetUp()
{
}
virtual void TearDown()
{
}
};
TEST_F(DateTimeUtilTest, TestAddSeconds_leap)
{
//闰年测试 2020-02-28
tm tt;
tt.tm_year = (2020 - 1900);
tt.tm_mon = 1;
tt.tm_mday = 28;
tt.tm_hour = 23;
tt.tm_min = 59;
tt.tm_sec = 50;
DateTimeUtil::AddSeconds(tt, 30);
EXPECT_TRUE(tt.tm_sec == 20);
EXPECT_TRUE(tt.tm_min == 0);
EXPECT_TRUE(tt.tm_hour == 0);
EXPECT_TRUE(tt.tm_mday == 29);
EXPECT_TRUE(tt.tm_mon == 1);
//非闰年测试 2019-02-28
tm tt1;
tt1.tm_year = (2019 - 1900);
tt1.tm_mon = 1;
tt1.tm_mday = 28;
tt1.tm_hour = 23;
tt1.tm_min = 59;
tt1.tm_sec = 50;
DateTimeUtil::AddSeconds(tt1, 30);
EXPECT_TRUE(tt1.tm_sec == 20);
EXPECT_TRUE(tt1.tm_min == 0);
EXPECT_TRUE(tt1.tm_hour == 0);
EXPECT_TRUE(tt1.tm_mday == 1);
EXPECT_TRUE(tt1.tm_mon == 2);
};
首先TDD的开发方式强调的是测试先行,编写测试代码是在前面的,这个过程等于是理解需求的过程。即想清楚你要实现的是什么功能?这个测试代码是理清需求的产物, 如此而已,不存在更多时间成本。
TDD开发方式属于典型的一次投入,持续受益的事情,用例积累越多,越容易在早期发现问题,重构有了质量保障,代码越来越整洁清晰,开发同学们再也不用哀叹历史代码。
招聘
阿里巴巴高德地图智能技术中心长期招聘机器学习算法、C++、Java 资深工程师/技术专家/高级专家,职位地点:北京。欢迎投递简历到 gdtech@alibaba-inc.com,邮件主题为:姓名-应聘团队-应聘方向。