安卓测试框架gtest

安卓测试框架gtest

1.简介

? 我们的开发是在安卓的源码上面裁剪出来的系统,类似安卓的原生开发。在安卓的哦原生代码中提供了gtest单元测试框架。

2.使用gtest

2.1 编译gtest的库

$ cd external/gtest
$ mm

此时执行很可能会出错,报错说有一些依赖的库不存在,所以要在源码中找到对应的代码编译为库。

我编译的顺序是:

$ cd external/libunwind
$ mm
$ cd external/libcxxabi
$ mm
$ cd external/libcxx
$ mm
$ cd external/gtest
$ mm

如果仍然报错说有依赖库不存在,可以在 external/compiler-rt 目录下执行一下命令 mm。

2.2 简单测试 TEST宏

TEST宏的作用是创建一个简单测试,它定义了一个测试函数,在这个函数里可以使用任何C++代码并使用上面提供的断言来进行检查。

TEST的第一个 参数是测试用例名,第二个 参数是测试用例中某项测试的名称。一个测试用例可以包含任意数量的独立测试。这两个参数组成了一个测试的全称

$ mkdir mygtest
$ cd mygetst

建立测试文件gtest1.cpp,文件内容如下:

#include <gtest/gtest.h>
int Factorial( int n )
{
    if(n==2) return 100; //故意出个错,嘻嘻
    return n<=0? 1 : n*Factorial(n - 1);
}  

//用TEST做简单测试
TEST(TestFactorial, ZeroInput) //第一个参数是测试用例名,第二个参数是测试名:随后的测试结果将以"测试用例名.测试名"的形式给出
{
	EXPECT_EQ(1, Factorial(0));  //EXPECT_EQ稍候再说,现在只要知道它是测试两个数据是否相等的就行了。
}  

TEST(TestFactorial, OtherInput)
{
    EXPECT_EQ(1, Factorial(1));
    EXPECT_EQ(2, Factorial(2));
    EXPECT_EQ(6, Factorial(3));
    EXPECT_EQ(40320, Factorial(8));
}   	

int main(int argc, char* argv[])
{
    testing::InitGoogleTest(&argc,argv); //用来处理Test相关的命令行开关,如果不关注也可不加
    RUN_ALL_TESTS();  //看函数名就知道干啥了
    std::cin.get();   //只是让它暂停而已,不然一闪就没了
    return 0;
}

编写Android.mk, 文件内容如下:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES:=
    gtest1.cpp

LOCAL_C_INCLUDES :=
    $(LOCAL_PATH)/include
	$(TOP)/external/gtest/include
    $(call include-path-for, audio-utils)

LOCAL_STATIC_LIBRARIES:= libgtest

LOCAL_SHARED_LIBRARIES := 

LOCAL_MODULE := gtest1

LOCAL_MODULE_TAGS := optional
include external/stlport/libstlport.mk
include $(BUILD_EXECUTABLE)

编译,并将可执行文件push到板子上执行:

[email protected]_mini:/ # gtest1
[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 2 tests from TestFactorial
[ RUN      ] TestFactorial.ZeroInput
[       OK ] TestFactorial.ZeroInput (0 ms)
[ RUN      ] TestFactorial.OtherInput
vendor/libratone/sdk/mygtest/gtest1.cpp:17: Failure
Value of: Factorial(2)
  Actual: 100
Expected: 2
vendor/libratone/sdk/mygtest/gtest1.cpp:18: Failure
Value of: Factorial(3)
  Actual: 300
Expected: 6
vendor/libratone/sdk/mygtest/gtest1.cpp:19: Failure
Value of: Factorial(8)
  Actual: 2016000
Expected: 40320
[  FAILED  ] TestFactorial.OtherInput (1 ms)
[----------] 2 tests from TestFactorial (2 ms total)

[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran. (3 ms total)
[  PASSED  ] 1 test.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] TestFactorial.OtherInput

 1 FAILED TEST

和预期相同,有一项PASSED。

####2.3 TEST_F做同配置的系列测试

TEST_F宏用于在多个测试中使用同样的数据配置,所以它又叫:测试夹具(Test Fixtures)

如果我们的多个测试要使用相同的数据(如前例中,我们的Test_GFN和Test_GP都使用程序自身的完整文件名来测试),就可以采用一个测试夹具。

要创建测试固件,只需:

创建一个类继承自testing::Test。将其中的成员声明为protected:或是public:,因为我们想要从子类中存取夹具成员。
在该类中声明测试中所要使用 大专栏  安卓测试框架gtest到的数据。
如果需要,编写一个默认构造函数或者SetUp()函数来为每个测试准备对象。
如果需要,编写一个析构函数或者TearDown()函数来释放你在SetUp()函数中申请的资源。
如果需要,定义你的测试所需要共享的子程序。
当我们要使用固件时,使用TEST_F()替换掉TEST(),它允许我们存取测试固件中的对象和子程序

#####测试流程:

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

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

创建一个类继承自testing::Test

#include "stdio.h"
#include <gtest/gtest.h>
using testing::Test;
class Test_mytest : public Test
{
	void SetUp()
	{
	}  

	void TearDown()
	{
	}
};  

需要被测试的函数或者类:

#include <stdio.h>

class Test_class
{
public:
    Test_class(){};
    ~Test_class(){};

    int testfunc(int n) { if (n > 10) return 0; else return -1;};
}

修改gtest1.cpp

#include <gtest/gtest.h>
#include "gtest1.h"  

TEST_F (Test_mytest, ThirdTest)
{
	EXPECT_EQ(0, tc->testfunc(11));
}

int main(int argc, char* argv[])
{
testing::InitGoogleTest(&argc,argv); //用来处理Test相关的命令行开关,如果不关注也可不加
RUN_ALL_TESTS();  //看函数名就知道干啥了
  std::cin.get();   //只是让它暂停而已,不然一闪就没了
  return 0;
}

修改Android.mk

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:=
    gtest1.cpp

LOCAL_C_INCLUDES :=
    $(LOCAL_PATH)/include
	$(TOP)/external/gtest/include
    $(call include-path-for, audio-utils)

LOCAL_STATIC_LIBRARIES:= libgtest

LOCAL_SHARED_LIBRARIES := 

LOCAL_MODULE := gtest1

LOCAL_MODULE_TAGS := optional
include external/stlport/libstlport.mk
include $(BUILD_EXECUTABLE)

执行mm命令编译后adb push到设备上,执行:

[email protected]_mini:/ # gtest1
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from Test_mytest
[ RUN      ] Test_mytest.ThirdTest
[       OK ] Test_mytest.ThirdTest (0 ms)
[----------] 1 test from Test_mytest (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (1 ms total)
[  PASSED  ] 1 test.

测试通过,ok.

####2.4 其他宏

Google提供了两种断言形式,一种以ASSERT_开头,另一种以EXPECT_开头,它们的区别是ASSERT_*一旦失败立马退出,而EXPECT_还能继续下去。

ASSERT_EQ(期望值 , 实际值 ); —-致命断言

EXPECT_EQ(期望值 , 实际值 ); —-非致命断言

参考gtest断言

参考链接

1.玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest

2.玩转Google开源C++单元测试框架Google Test系列(gtest)之二 - 断言

3.玩转Google开源C++单元测试框架Google Test系列(gtest)之三 - 事件机制

4.玩转Google开源C++单元测试框架Google Test系列(gtest)之四 - 参数化

5.玩转Google开源C++单元测试框架Google Test系列(gtest)之五 - 死亡测试

6.玩转Google开源C++单元测试框架Google Test系列(gtest)之六 - 运行参数

7.玩转Google开源C++单元测试框架Google Test系列(gtest)之七 - 深入解析gtest

8.玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单元测试框架

原文地址:https://www.cnblogs.com/dajunjun/p/11712897.html

时间: 2024-08-18 22:33:38

安卓测试框架gtest的相关文章

安卓测试框架的环境搭建

测试是开发很重要的一部分.有句话说,好的应用不是开发出来的,而是测出来的.虽然作为程序员我们并不需要很精通测试,但是我们还是需要了解一下测试的基本内容. 安卓中提供了一个测试框架给我们使用.我们只需要继承这个框架就可以进行单元测试. 准备工作 新建一个安卓项目,在新建两个类,一个用于做测试框架类,一个用于演示的工具类. 演示工具类没什么,只是为了演示而已. 这里我们重点说一下测试框架类. 环境搭建: 安卓中搭建测试框架类非常简单,只需要新建一个类,然后继承AndroidTestCase类就可以了

安卓测试基础(一)

Testing Fundamentals The Android testing framework, an integral part of the development environment, provides an architecture and powerful tools that help you test every aspect of your application at every level from unit to framework. 安卓测试框架,是开发环境的重

MFC程序使用GTest搭建测试框架

一.起源 最近对单元测试比较感兴趣,之后就上网搜了一些测试的框架,C++项目使用的测试框架基本上都使用的GoogleTest,之后就开启了gtest的学习之路. 主要是根据<玩转Google开源C++单元测试框架Google Test系列(gtest)>这个系列的博客来学习的. 因为平时的项目主要是MFC项目,就想着给MFC程序搭建一个测试框架出来,上网搜主要都是<gtest测试MFC项目>类似的. 跟着网上的教程走了很多遍,都没有成功,网上又没有更多的相关资料,就放弃在MFC项目

安卓自动化测试:Robotium(二)page object 模式完善测试框架

1.目前比较流行的设计模式就是page object,page object就是把页面作为对象,在使用中传递页面对象,来使用页面对象中相应的成员或者方法,能更好的提现java的面向对象和封装特性2.具体思想:测试框架分为四大类1)编写抽象父类:建立Utils包,存放工具类,用于自动完成唤醒手机.解锁.登录等前置操作,之后的用例只需继承抽象父类即可2)提取控件ID类:在工程中建立从com.pacagename.test.elements包用例存放控件ID类.命名一般以Element开头,后面接Ac

Google Test测试框架分析

Google Test测试框架分析 一.简介 Google Test是由Google主导的一个开源的C++自动化测试框架,简称GTest.GTest基于xUnit单元测试体系,和CppUint类似,可以看作是JUnit.PyUnit等对C++的移植. 下图是GTest测试框架的测试过程,表示的是GTest的两种测试方式. 下面将使用一个极其简单的例子表示xUnit测试的主要过程.如对Hummer的CTXString类的成员方法GetLength进行测试.详见下面GTest代码和注释说明. //

Google C++单元测试框架---GTest的Sample1和编写单元测试的步骤

如果你还没有搭建gtest框架,可以参考我之前的博客:http://www.cnblogs.com/jycboy/p/6001153.html.. 1.The first sample: sample1 你把github上的项目导来之后,github地址:https://github.com/google/googletest,在目录:..(你的目录)\googletest-master\googletest\samples是你的samples文件夹. 在VS中创建项目:GtestSamples

Google C++单元测试框架---Gtest框架简介(译文)

一.设置一个新的测试项目 在用google test写测试项目之前,需要先编译gtest到library库并将测试与其链接.我们为一些流行的构建系统提供了构建文件: msvc/ for Visual Studio, xcode/ for Mac Xcode, make/ for GNU make, codegear/ for Borland C++ Builder. 如果你的构建系统不在这个名单上,在googletest根目录有autotools的脚本(不推荐使用)和CMakeLists.txt

Android开源测试框架学习

近期因工作需要,分析了一些Android的测试框架,在这也分享下整理完的资料. Android测试大致分三大块: 代码层测试 用户操作模拟,功能测试 安装部署及稳定性测试 代码层测试 对于一般java代码,采用传统的Junit测试,开发人员通常会编写重要接口和函数的白盒测试代码,不做过多讨论. 但因Android的特殊运行机制(Dalvik虚拟机),其中存在Application.Activity.Service等特殊组件,而这些组件都涉及到生命周期管理的问题. 为了对这些组件进行测试,Goog

测试驱动开发TDD(三)开源测试框架的选择

http://www.qnr.cn/pc/rj/zhongji/ruanze/201008/523311.html  * http://www.uml.org.cn/Test/201006085.asp ** http://blog.csdn.net/jq0123/article/details/5479998 *** 最终选择Google的GTest作为我们开发的测试框架.