那些与TDD斗争的人是如何放弃断言的呢?

时间:2016-07-25 08:50:44

标签: unit-testing testing continuous-integration tdd

我在整个职业生涯中都有过测试/ tdd的爱/恨关系。最近我开始喜欢通过不使用断言声明来编写测试。它为我创造了世界上所有的不同。原因如下:

  • 速度接近我没有写任何测试时的速度。

  • 我不会浪费时间在每次测试结束时尝试使用assert(foo,2)或!assert(foo,nil)逻辑

  • 我只是在测试结束时放入foo.inspect,运行它,然后在它工作时继续运行

  • 下一个程序员仍然有一个很棒的小测试,它显示了我的意图并且知道这个代码在某一点上有效或者不存在。

  • 测试失败时没有破坏构建,因为没有断言测试永远不会失败。

  • 测试不是一次又一次地全天候运行来捕获一些东西。当你想调试一些代码并给下一个程序员留下非常好的笔记时(或许你),它们就在那里

  • 随着岁月的流逝和测试中断,没有任何技术债务可以支付。这些测试总是作为代码的考古遗迹,在某个时间点向控制台提供一些有用的信息。

我的问题是,这是一种已知的测试方式吗?因为我刚刚发现它是必要的。但TDD人员是否使用此系统?

2 个答案:

答案 0 :(得分:1)

  • 速度是相对的:)你正在等待调试时间
  • 如果你不这样做,请不要写断言。想要。只测试需要的东西
  • 对此事没有意见我不知道.inspect是什么
  • 是<或li>的评论是什么?
  • 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。

  • 这些遗物确保你的代码仍然像20年前那样做。在重构的过程中,你必须重新考虑测试。但最终他们确保你不会破坏你已经忘记的特征,或者一开始就没有新特征

答案 1 :(得分:0)

单元测试的一大优势是,一旦编写完成,它们就可以自动运行数百或数千次而无需额外的工作。

这使得持续集成变得如此强大。自动运行测试,然后经常运行它们。这样,当您添加新代码或重构时,如果现有代码已被破坏,您将获得快速反馈。

良好的自动化单元测试覆盖率的存在消除了一些改变代码的恐惧。这鼓励更频繁的重构,并且通常会产生更好的代码库。

如果您编写必须手动运行的单元测试,那么您将失去这一优势。