我在整个职业生涯中都有过测试/ tdd的爱/恨关系。最近我开始喜欢通过不使用断言声明来编写测试。它为我创造了世界上所有的不同。原因如下:
速度接近我没有写任何测试时的速度。
我不会浪费时间在每次测试结束时尝试使用assert(foo,2)或!assert(foo,nil)逻辑
我只是在测试结束时放入foo.inspect,运行它,然后在它工作时继续运行
下一个程序员仍然有一个很棒的小测试,它显示了我的意图并且知道这个代码在某一点上有效或者不存在。
测试失败时没有破坏构建,因为没有断言测试永远不会失败。
测试不是一次又一次地全天候运行来捕获一些东西。当你想调试一些代码并给下一个程序员留下非常好的笔记时(或许你),它们就在那里
随着岁月的流逝和测试中断,没有任何技术债务可以支付。这些测试总是作为代码的考古遗迹,在某个时间点向控制台提供一些有用的信息。
我的问题是,这是一种已知的测试方式吗?因为我刚刚发现它是必要的。但TDD人员是否使用此系统?
答案 0 :(得分:1)
imho测试应该在开始时失败并且您编写代码以使其不会失败
use warnings;
use strict;
open STDOUT, '>>', "my_stdout_file.txt";
#die qq[Usage: perl $0 <keyword-file> <search-file> <file-name>\n] unless @ARGV == 3;
my $filename = $ARGV[2];
chomp ($filename);
open my $fh, q[<], shift or die $!; --- This file handle Opening all the 3 arguments. I need to Open only 2.
my %keyword = map { chomp; $_ => 1 } <$fh>;
print "$fh\n";
while ( <> ) {
chomp;
my @words = split;
for ( my $i = 0; $i <= $#words; $i++ ) {
if ( $keyword{^$words[ $i ] } ) {
print "Keyword Found for file:$filename\n";
printf qq[$filename Line: %4d\tWord position: %4d\tKeyword: %s\n],
$., $i, $words[ $i ];
}
}
}
close ($fh);
如果你在没有编程的情况下运行测试,它将失败(这是第一步)
现在编写使其正常工作的代码
$returnVar = myClass->methodReturnsTrue();
$this->assertTrue($returnVar);
现在已修复。测试运行并测试您的代码。你现在可以一遍又一遍地运行它。没有它失败
您不必全天候运行测试,但仅在代码更改(新功能或错误修复)上使用CI。
答案 1 :(得分:0)
单元测试的一大优势是,一旦编写完成,它们就可以自动运行数百或数千次而无需额外的工作。
这使得持续集成变得如此强大。自动运行测试,然后经常运行它们。这样,当您添加新代码或重构时,如果现有代码已被破坏,您将获得快速反馈。
良好的自动化单元测试覆盖率的存在消除了一些改变代码的恐惧。这鼓励更频繁的重构,并且通常会产生更好的代码库。
如果您编写必须手动运行的单元测试,那么您将失去这一优势。