【发布时间】:2014-01-24 21:30:29
【问题描述】:
我正在编写一个函数,它将一个复杂的公式应用于一堆整数。当我进行大量更改时,我总是编译然后在运行时执行一堆测试用例以确保我没有破坏任何东西,所以我想“好吧,我将一些测试用例放入我的代码中”。
但这当然是不可取的,因为该函数需要一段时间才能完成它的工作,并且每次执行程序时都会运行测试。是否有任何简单的方法可以自动执行此操作,以便在编译时检查某些情况?这是一个小例子,展示了我当前(不太理想)的方法。
#include <iostream>
int binom(int, int);
int main() {
//I don't want these tests to happen at runtime...
bool test1 = (binom(5,2)!=10); //5 choose 2 should be 10
bool test2 = (binom(7,4)!=35); //7 choose 4 should be 35
if (test1 || test2) {
std::cout << "Your algorithm has an error!";
return 0;
}
int n, k;
std::cout << "n: "; std::cin >> n;
std::cout << "k: "; std::cin >> k;
std::cout << n << " choose "
<< k << " is " << binom(n,k);
return 0;
}
int binom(int n, int k) {
if (k > n/2)
k = n-k;
int nCk = 1, i=1;
for ( ; i<=k; ++i) {
nCk *= n-k+i;
nCk /= i;
}
return nCk;
}
(我正在编写的函数比 n 选择 k 更复杂,我只是想举一个简单的例子来说明我正在尝试做的事情。)我已经阅读了有关单元测试和名为“编译时函数”的内容执行”,但我认为前者不适用,我也不太了解后者,所以我想知道是否有一种简单的方法可以理解这些或实现类似的目标。
【问题讨论】:
-
听起来你需要考虑单元测试。
-
Boah,我完全误解了标题!已编辑...
-
@πάνταῥεῖ 我不确定我是否理解;这似乎是我的问题“你如何在编译时测试函数?”的一个答案。是“通过单元测试”。但我的问题并不是专门关于单元测试的。我觉得这种改变类似于改变“什么是杀死东西的最好方法?”到“你怎么用枪?”
-
@Joseph 然后指定您希望在编译时检查的具体内容:由模板化签名和具体模板参数提供的特定运算符/函数/typedef 成员?? (这就是我一直认为你要求的第一名,但阅读你的问题我怀疑这是你想要的!)。
-
作为替代方案,我建议使用
assert(),它会在调试模式下运行代码时退出,但在运行发布模式软件时无效。
标签: c++ unit-testing compilation