GTest基础学习-06-第6个单元测试-接口测试(类型参数驱动)

本文深入探讨使用GTest进行接口测试的方法,通过具体示例展示如何对不同实现的相同接口进行有效测试,避免代码重复,确保接口功能正确。

       前面的文章学习了使用gtest进行函数级的测试和类级的测试,这篇来学习如何通过gtest来测试接口。这个接口我们在prime_table.h中,接口的头和实现部分都放置同一个文件,这个文件也在sample文件夹下。这篇学习第6个单元测试,介绍如何测试一个接口有多种实现,而且没种实现都要单元测试,做到测试代码不重复。本篇新引入了几个宏,有一些模板函数的思想,加上新的测试宏,看起来有费劲,不易理解和掌握。这个知识点比前面学习都要高级的特性和复杂。

 

1.代码准备

prime_table.h代码

#ifndef GTEST_SAMPLES_PRIME_TABLES_H_
#define GTEST_SAMPLES_PRIME_TABLES_H_

#include <algorithm>

// prime table 接口
class PrimeTable {
public:
	virtual ~PrimeTable() {}

	// 只有n是素数返回true
	virtual bool IsPrime(int n) const = 0;

	// 返回比P大的最小的素数
	// 如果下一个素数超出表的容量,就返回-1
	virtual int GetNextPrime(int p) const = 0;
};

// 实现 #1 实时计算素数
class OnTheFlyPrimeTable : public PrimeTable {
public:
	bool IsPrime(int n) const override {
		if (n <= 1) return false;

		for (int i = 2; i*i <= n; i++) {
			if ((n % i) == 0) return false;
		}

		return true;
	}

	int GetNextPrime(int p) const override {
		for (int n = p + 1; n > 0; n++) {
			if (IsPrime(n)) return n;
		}

		return -1;
	}
};

// 实现 #2 预计算素数并存储结果到一个数组
class PreCalculatedPrimeTable : public PrimeTable {
public:
	// max用来指定素数表最大数
	explicit PreCalculatedPrimeTable(int max)
		: is_prime_size_(max + 1), is_prime_(new bool[max + 1]) {
		CalculatePrimesUpTo(max);
	}
	~PreCalculatedPrimeTable() override { delete[] is_prime_; }

	bool IsPrime(int n) const override {
		return 0 <= n && n < is_prime_size_ && is_prime_[n];
	}

	int GetNextPrime(int p) const override {
		for (int n = p + 1; n < is_prime_size_; n++) {
			if (is_prime_[n]) return n;
		}

		return -1;
	}

private:
	void CalculatePrimesUpTo(int max) {
		::std::fill(is_prime_, is_prime_ + is_prime_size_, true);
		is_pri
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值