• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

Google C++ 自动测试框架入门

发布: 2009-5-30 11:26 | 作者: 网络转载 | 来源: 测试时代采编 | 查看: 451次 | 进入软件测试论坛讨论

领测软件测试网

调用测试

TEST()TEST_F()向Google Test隐式注册它们的测试。因此,与很多其他的C++测试框架不同,你不需要为了运行你定义的测试而将它们全部再列出来一次。

在定义好测试后,你可以通过RUN_ALL_TESTS()来运行它们,如果所有测试成功,该函数返回0,否则会返回1.注意RUN_ALL_TESTS()会运行你链接到的所有测试——它们可以来自不同的测试案例,甚至是来自不同的文件。

当被调用时,RUN_ALL_TESTS()宏会:

  1. 保存所有的Google Test标志。
  2. 为一个侧测试创建测试固件对象。
  3. 调用SetUp()初始化它。
  4. 在固件对象上运行测试。
  5. 调用TearDown()清理固件。
  6. 删除固件。
  7. 恢复所有Google Test标志的状态。
  8. 重复上诉步骤,直到所有测试完成。

此外,如果第二步时,测试固件的构造函数产生一个致命错误,继续执行3至5部显然没有必要,所以它们会被跳过。与之相似,如果第3部产生致命错误,第4部也会被跳过。

重要:你不能忽略掉RUN_ALL_TESTS()的返回值,否则gcc会报一个编译错误。这样设计的理由是自动化测试服务会根据测试退出返回码来决定一个测试是否通过,而不是根据其stdout/stderr输出;因此你的main()函数必须返回RUN_ALL_TESTS()的值。

而且,你应该只调用RUN_ALL_TESTS()一次。多次调用该函数会与Google Test的一些高阶特性(如线程安全死亡测试)冲突,因而是不被支持的。

有效平台: Linux, Windows, Mac.

编写main()函数

你可以从下面这个样板开始:

#include "this/package/foo.h"
#include <gtest/gtest.h>

namespace {

// The fixture for testing class Foo.
class FooTest : public testing::Test {
 
protected:
 
// You can remove any or all of the following functions if its body
 
// is empty.

 
FooTest() {
   
// You can do set-up work for each test here.
 
}

 
virtual ~FooTest() {
   
// You can do clean-up work that doesn't throw exceptions here.
 
}

 
// If the constructor and destructor are not enough for setting up
 
// and cleaning up each test, you can define the following methods:

 
virtual void SetUp() {
   
// Code here will be called immediately after the constructor (right
   
// before each test).
 
}

 
virtual void TearDown() {
   
// Code here will be called immediately after each test (right
   
// before the destructor).
 
}

 
// Objects declared here can be used by all tests in the test case for Foo.
};

// Tests that the Foo::Bar() method does Abc.
TEST_F
(FooTest, MethodBarDoesAbc) {
 
const string input_filepath = "this/package/testdata/myinputfile.dat";
 
const string output_filepath = "this/package/testdata/myoutputfile.dat";
 
Foo f;
  EXPECT_EQ
(0, f.Bar(input_filepath, output_filepath));
}

// Tests that Foo does Xyz.
TEST_F
(FooTest, DoesXyz) {
 
// Exercises the Xyz feature of Foo.
}

}  // namespace

int main(int argc, char **argv) {
  testing
::InitGoogleTest(&argc, argv);
 
return RUN_ALL_TESTS();
}

testing::InitGoogleTest()函数负责解析命令行传入的Google Test标志,并删除所有它可以处理的标志。这使得用户可以通过各种不同的标志控制一个测试程序的行为。关于这一点我们会在GTestAdvanced中讲到。你必须在调用RUN_ALL_TESTS()之前调用该函数,否则就无法正确地初始化标示。

在Windows上InitGoogleTest()可以支持宽字符串,所以它也可以被用在以UNICODE模式编译的程序中。

进阶阅读

恭喜你!你已经学到了一些Google Test基础。你可以从编写和运行几个Google Test测试开始,再阅读一下GoogleTestSamples,或是继续研究GoogleTestAdvancedGuide,其中描述了很多更有用的Google Test特性。

已知局限

Google Test被设计为线程安全的。但是,我们还没有时间在各种平台上实现同步原语(synchronization primitives)。因此,目前从两个线程同时使用Google Test断言是不安全的。由于通常断言是在主线程中完成的,因此在大多数测试中这都不算问题。如果你愿意帮忙,你可以试着在gtest-port.h中实现必要的同步原语。

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/

44/4<1234

关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网