如何在使用DBI的Perl模块中获得100%的测试覆盖率?
我对Devel :: Cover模块有点新,但发现它确保我没有错过测试非常有用.
我遇到的一个问题是了解Devel :: Cover的报告.我查看了文档,但无法弄清楚我需要测试什么才能获得100%的覆盖率.
以下是封面报告的输出: line err stmt bran cond sub pod time code ... 36 sub connect_database { 37 3 3 1 1126 my $self = shift; 38 3 100 24 if ( !$self->{dsn} ) { 39 1 7 croak 'dsn not supplied - cannot connect'; 40 } 41 *** 2 33 21 $self->{dbh} = DBI->connect( $self->{dsn},q{},q{} ) 42 || croak "$DBI::errstr"; 43 1 11 return $self; 44 } ... line err % l !l&&r !l&&!r expr ----- --- ------ ------ ------ ------ ---- 41 *** 33 1 0 0 'DBI'->connect($$self{'dsn'},'','') || croak("$DBI::errstr") 以下是测试此特定行的代码示例: my $database = MyModule::Database->new( { dsn => 'Invalid DSN' }); throws_ok( sub { $database->connect_database() },qr/Can't connect to data source/,'Test connection exception (invalid dsn)' ); 此测试通过 – 连接确实抛出错误并完成我的“throws_ok”测试. 我确实有一些测试可以测试成功的连接,这就是为什么我认为我有33%的覆盖率,但如果我正确地阅读它,封面认为我没有测试语句的“|| croak”部分.我以为我是,通过“throws_ok”测试,但显然我错过了一些东西. 有没有人有关于如何成功测试我的DBI->连接线的建议? 谢谢! 编辑: brian向我发送了HTML报告和真相表,解释了为什么41号线没有通过.唯一的问题是我无法弄清楚它告诉我的是什么.我想我问题的真正核心是为什么这条特定的线不能通过覆盖. 这是真值表: LINE # % # coverage # condition 41 # 33 # A | B | dec # 'DBI'->connect($$self{'dsn'},'') || croak("$DBI::errstr") # # 0 | 0 | 0 # # # 0 | 1 | 1 # # # 1 | X | 1 # (THIS LINE IS Green - the rest are red) 如果有人能帮助解释这个真相表,我会很感激.还提到要通过覆盖我需要有一个模拟数据库对象,但我不太清楚覆盖结果中的任何内容会让我知道这一点. 再次感谢! 解决方法
此外,不要过于依赖100%的测试覆盖率.目标是完全测试您的应用程序,而不是在Devel :: Cover中获得完美的分数.请参阅Ovid关于该主题的帖子:
> More on 100% Test Coverage 在你的情况下,看起来你没有覆盖所有的分支,所以你没有得到完美的分数.你需要测试那些||的两侧.您获得的覆盖率为33%,因为您只能处理该行的三分之一的案例.来自Devel :: Cover的HTML报告显示了真值表以及您缺少的案例. 真值表显示了您必须覆盖分支的可能状态. A 1表示条件为真,0表示条件为假,X表示您无法达到的条件.您必须测试可以执行的所有组合.自||是一个短路运算符,一旦其中一个通过,您就不必测试条件: 0 || 1 connect to database fails and croak succeeds 0 || 0 connect to database fails and croak fails (unlikely) 1 || X connect to database succeeds,so short circuit 这与您的特定问题有点无关,但我发现它经常出现在这些问题中.虽然Effective Perl Programming是远离上架的一个月,但Josh McAdams花了很多时间谈论Perl中的依赖注入.如果您在测试代码时遇到困难,通常会遇到设计问题.例如,如果您在子程序中内部生成数据库对象,那么您将自己画成一个角落.这就是为什么它可能很难测试.这可能不是你的问题,但它需要考虑. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- thinkphp5使用bootstrapvalidator进行异步验证邮箱的示例
- 七牛数据处理再添新兵——图片瘦身
- Perl中中型数据的最佳IPC机制是什么?
- 设计模式实例(Lua)笔记之二(AbstractFactory抽象工厂模式)
- thinkPHP删除前弹出确认框的简单实现方法
- lua: pcall xpcall debug
- 什么时候Perl脚本需要在调用`localtime`之前调用`tzset`?
- delphi – 项目中文件的Design Class属性是什么?
- [试玩] FMXLinux (Firemonkey for Linux) Linux 桌面开发(
- 机房收费系统初体验——"歪打"无按钮标题栏,"正着"父窗