Gtest 对比 Junit

1、用例执行顺序

gtest:

无法人为控制执行顺序,同一套件,测试案例依据书写顺序,从上到下依次执行

junit:

1)类前使用@FixMethodOrder(MethodSorteds.NAME_ASCENDING)
2) 被@TEST修饰的测试案例名称按升序执行

示例:以下两个用例会先执行:test1AbnormalStartRegister() ,再执行:test2NormalStartRegister()

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@RunWith(AndroidJUnit4.class)
public class RegisterTest {
    private static final String TEST = "RegisterTest";
    private int ret;
    String accountId = "test001";
    float[] feat;

    @Before
    public void setUp() {
        ret = -1;
        Log.i(TEST, "Get the looper object of the current process");
        if (Looper.myLooper() == null) {
            Looper.prepare();
        }
    }

    @After
    public void tearDown() {

        instance.release();
    }
    
    @Test
    public void test2NormalStartRegister() {}

    @Test
    public void test1AbnormalStartRegister() {}

2、断言

gtest:

断言更加丰富 主要包含EXPECT_**和ASSERT_**两个系列:

  1. ASSERT_* 系列的断言,当检查点失败时,退出当前函数
  2. EXPECT_* 系列的断言,当检查点失败时,继续往下执行

junit:

断言方式相对较少,总共8种:
assertEquals(boolean expected, boolean actual) 检查两个变量或者等式是否相同
assertTrue(boolean condition) 检查条件为真
assertFalse(boolean condition) 检查条件为假
assertNull(Object object) 检查对象为空
assertNotNull(Object object) 检查对象不为空
assertSame(Object expected, Object actual) 检查两个相关对象是否指向同一个对象
assertNotSame (Object expected, Object actual) 查两个相关对象是否不指向同一个对象
assertArrayEquals(expectedArray, resultArray) 检查两个数组是否相等

3、事件机制

gtest:

全局事件机制:类继承testing::Environment;实现里面的SetUp和TearDown方法 ;添加这个全局事件,我们需要在main函数中通过testing::AddGlobalTestEnvironment方法将事件挂进来;
局部事件机制: 继承testing::Test,然后实现两个静态方法SetUpTestCase()、TearDownTestCase() 、
个体事件机制:继承testing::Test 实现SetUp方法和TearDown方法

junit:

不存在全局事件机制,只有局部事件机制@BeforeClass,@AfterClass、个体事件机制@Before @After

4、参数化

gtest:

参数化使用相较junit简单很多,分为两步:
1.类继承自:testing::testingWithParam (int:参数化数据类型)
2.INSTANTIANCE_TEST_CASE_P(任意名称、类名、testing::Values())

示例:

class EnableTest : public ::testing::TestWithParam<int> {
protected:
    int err;
virtual void SetUp() {

        err = -1;
        err = ICVPStartClient();
        DEBUG_TRACE_DEBUG ("StartClient() err = %d",err );
        ASSERT_EQ(err, ICVP_SUCCESS);
        sleep(1);
    }
    virtual void TearDown() {

        err=ICVPStopClient();
        DEBUG_TRACE_DEBUG ("StopClient() err = %d",err );
        ASSERT_EQ(err, ICVP_SUCCESS);
        sleep(0.5);
    }
}

INSTANTIATE_TEST_SUITE_P(IPHONE, EnableTest, testing::Values(0,1,2,3,4,5,6,7,8,9,19,20,21,22,23,24,25,26));

Junit:

  1. 对测试类添加注解 @RunWith(Parameterized.class)
  2. 将需要使用变化范围参数值测试的参数定义为私有变量
  3. 使用上一步骤声明的私有变量作为入参,创建构造函数
  4. 创建一个使用@Parameters注解的公共静态方法,它将需要测试的各种变量值通过集合的形式返回。
  5. 使用定义的私有变量定义测试方法

示例:

@RunWith(Parameterized.class)
public class ParamTest {
    private static final String TEST = "ParamTest";
    com.iflytek.autofly.icvp.sdk.IICVPManager instance;

    private int exp=0;
    private int funcParam=0;
    private int ret=-1;

    public void ParamTest(int p_funcParam,int p_exp ){
      Log.i(TEST,"Constructor");
      this.exp= p_exp;
      this.funcParam=p_funcParam;

    }
    @Before
   public void setUp(){
    if(Looper.myLooper()==null){
        Looper.prepare();
    }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
   }

   @After
   public void tearDown(){
       Log.i("TEST","release instance ");
   }

   @Parameterized.Parameters
   public static Collection ParamFunc(){
        return Arrays.asList(new Object[][]{
        		{ControlConstants.A,ErrorConstants.SUCCESS},
                {ControlConstants.B,ErrorConstants.SUCCESS},
                {ControlConstants.C,ErrorConstants.SUCCESS},
                {ControlConstants.D,ErrorConstants.SUCCESS}}
                );
   }

    @Test
    public void enableFunc(){
                    Assert.assertEquals(exp,ret);
    		}
}

5、运行所有案例

gtest:

TEST TEST_F TEST_P 宏所声明的方法都会自动被运行

junit :

创建一个类,使用注释
@RunWith(Suite.class)
@Suite.SuiteClasses({a.class,b.class,c.class})

示例:

@RunWith(Suite.class)
@Suite.SuiteClasses({FlowTest.class,ParamTest.class,RegisterTest.class,LoopTest.class})
public class RunAllCases {
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值