#include <criterion/criterion.h>
#include "../../src/fibo.h"
Test(fibonacci, first_term_is_0)
{
// given
int term_to_compute = 0;
// when
int result = fibonacci(term_to_compute);
// then
cr_assert_eq(result, 0);
}
Test(fibonacci, second_term_is_1)
{
// given
int term_to_compute = 1;
// when
int result = fibonacci(term_to_compute);
// then
cr_assert_eq(result, 1);
}
以及相关的生产代码:
#include "fibo.h"
unsigned long fibonacci(unsigned int term_to_compute)
{
return term_to_compute;
}
正如您所看到的,生产代码是相当愚蠢的,它需要更多的测试,因为它只满足指定的需求(单元测试)。 编辑:查看Make documentation,了解更多关于语法、内置函数等的信息。如果你想了解更多关于TDD的信息,YouTube有很多可以提供(实时编码、解释、TDD kata):查看Robert C Martin(Bob叔叔)、持续交付渠道等。 PS:返回一个long不是最好的选择,你可能希望固定大小的整数在不同的平台上有相同的结果,但问题是关于“如何TDD”。如果你是TDD新手,写given/when/then可能会有帮助。先写测试,并考虑边缘情况(如,指定溢出?)。我在做NASM TDD和用C测试时使用类似的设置。
1条答案
按热度按时间sirbozc51#
下面是我在使用criterion的小型TDD项目中使用的一个简单Makefile:
它使用C89编译生产代码(-ansi)并使用未指定的标准测试代码。
src/
中的文件被移动到obj/
,tests/src/
和tests/obj/
也是如此。测试二进制文件(AKA测试套件)依赖于每个源文件,并且包含在每个测试二进制文件中,这使得它们更大,但对于小项目来说这不是问题。如果二进制文件大小是个问题,必须为每个二进制文件指定要包含哪些对象。目录结构是使用以下命令创建的:
示例测试文件:
以及相关的生产代码:
正如您所看到的,生产代码是相当愚蠢的,它需要更多的测试,因为它只满足指定的需求(单元测试)。
编辑:查看Make documentation,了解更多关于语法、内置函数等的信息。如果你想了解更多关于TDD的信息,YouTube有很多可以提供(实时编码、解释、TDD kata):查看Robert C Martin(Bob叔叔)、持续交付渠道等。
PS:返回一个
long
不是最好的选择,你可能希望固定大小的整数在不同的平台上有相同的结果,但问题是关于“如何TDD”。如果你是TDD新手,写given/when/then
可能会有帮助。先写测试,并考虑边缘情况(如,指定溢出?)。我在做NASM TDD和用C测试时使用类似的设置。