前面的文章学习了使用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

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

被折叠的 条评论
为什么被折叠?



