我是一个C程序,可以输入素数到输入数字。我想测试这个程序,看看它是否给出了复合数字。现在我需要实施测试,我发现很难。所以如果有人能帮助我,我会很感激。
这是我的Checkprime.c:
#include "defs.h"
#include "externs.h"
#include "minunit.h"
int CheckPrime(int K){
int J;
for (J=2; J*J <= K; J++){
if (Prime[J] == 1){
if (K % J == 0) {
Prime[K] = 0;
return 0;
}
}
}
Prime[K] = 1;
return 1;
}
这是我的主要文件。
#include <stdio.h>
#include "defs.h"
#include "checkprime.c"
int Prime[MaxPrimes];
int main()
{
int UpperBound;
int N;
int *ba = &UpperBound;
printf("enter upper bound\n");
scanf("%d",ba);
Prime[2] = 1;
for (N = 3; N <= *ba; N+= 2){
CheckPrime(N);
if (Prime[N]== 1) printf("%d is a prime\n",N);
}
}
这是我的minunit.c(测试,已实施):
#undef NDEBUG
#ifndef _minunit_h
#define _minunit_h
#include <stdio.h>
#include <stdlib.h>
#define mu_suite_start() char *message = NULL
#define mu_assert(test, message) if (!(test)) { return message; }
#define mu_run_test(test) \
message = test(); tests_run++; if (message) return message;
#define RUN_TESTS(name) int main(int argc, char *argv[]) {\
argc = 1; \
printf("----\nRUNNING: %s\n", argv[0]);\
char *result = name();\
if (result != 0) {\
printf("FAILED: %s\n", result);\
}\
else {\
printf("ALL TESTS PASSED\n");\
}\
printf("Tests run: %d\n", tests_run);\
exit(result != 0);\
}
int tests_run;
#endif
我在互联网上找到了minunit.c,我不知道如何实现我想要的测试,并让它工作。我的目标是为我的程序做一个简单的测试。
答案 0 :(得分:0)
最终,测试只不过是一些代码来运行你的代码并检查你的假设是否正确。当你开始时,保持简单。不是使用测试框架,而是从assert()
开始。
以下是测试CheckPrime()
的方法。
#include <assert.h>
#include "checkprime.h"
void test_CheckPrime_primes() {
int primes[] = {
2, 3, 5, 7, 11, 13, 0
};
for( int idx = 0; primes[idx] != 0; idx++ ) {
assert( CheckPrime(primes[idx]) );
}
}
void test_CheckPrime_composites() {
int composites[] = {
1, 4, 6, 8, 9, 10, 12, 14, 0
};
for( int idx = 0; composites[idx] != 0; idx++ ) {
assert( !CheckPrime(composites[idx]) );
}
}
int main() {
test_CheckPrime_primes();
test_CheckPrime_composites();
return 0;
}
这个简单的测试程序将揭示使用CheckPrime()
的问题。最大的两个是它没有头文件,并且Primes
必须由调用者初始化。它还允许您了解要编写的断言类型。例如,0会发生什么? 1? -1? INT_MAX
?候选人大于Primes
数组?
一旦您掌握了基础知识,并了解测试的全部内容,assert()
可以替换为more informative asserts和testing framework。
答案 1 :(得分:0)
这是我的minunit.c ...
我认为你的意思是minunit.h
。鉴于此,您可以实施类似mu_checkprime.c
:
#include "checkprime.c"
int Prime[MaxPrimes];
static char *test_primes()
{
mu_assert(CheckPrime(2) == 1, "2 not found to be prime");
mu_assert(CheckPrime(3) == 1, "3 not found to be prime");
mu_assert(CheckPrime(5) == 1, "5 not found to be prime");
mu_assert(CheckPrime(7) == 1, "7 not found to be prime");
mu_assert(CheckPrime(11) == 1, "11 not found to be prime");
mu_assert(CheckPrime(13) == 1, "13 not found to be prime");
return 0;
}
static char *test_composites()
{
mu_assert(CheckPrime(1) == 0, "1 found to be prime");
mu_assert(CheckPrime(4) == 0, "4 found to be prime");
mu_assert(CheckPrime(6) == 0, "6 found to be prime");
mu_assert(CheckPrime(8) == 0, "8 found to be prime");
mu_assert(CheckPrime(9) == 0, "9 found to be prime");
mu_assert(CheckPrime(10) == 0, "10 found to be prime");
mu_assert(CheckPrime(12) == 0, "12 found to be prime");
mu_assert(CheckPrime(14) == 0, "14 found to be prime");
return 0;
}
static char *all_tests()
{
mu_suite_start();
mu_run_test(test_primes);
mu_run_test(test_composites);
return 0;
}
RUN_TESTS(all_tests)