如何测试机器人检测脚本



我已经用PHP编写了一个机器人检测脚本。我想通过发送机器人点击链接来测试该脚本,这样我就可以知道该脚本是否有效。我该怎么做?

以下是PHP代码:

function bot_detected($USER_AGENT){
$crawlers = array(
'Googlebot',
'msnbot',
'Yahoo',
'Lycos',
'facebookexternalhit'
);
$crawlers_agents = implode('|', $crawlers);
if(strpos($crawlers_agents, $USER_AGENT) === false){
return false;
} else {
return TRUE;
}
}

您可以使用chrome插件来设置自定义用户代理,以便对其进行测试,例如这个

测试的核心是模拟环境。

首先,下载一个测试套件。我推荐并使用PHPUnit。这将允许您编写能够在单独文件中存在的代码更改中幸存下来的测试。如果没有测试套件,您将不可避免地编写一个名为驱动程序的程序并做同样的事情,但驱动器文件经常会丢失或被遗忘,因为每个文件都是根据需要进行编码的,而且它们通常没有系统来将驱动程序存储在一起或使用一致且可预测的命名模式。出于这些原因,我建议您学习一个测试套件,比如PHPUnit,这将迫使您考虑测试寿命和文件名约定。

一旦选择了测试套件,就从设计测试套件开始。你的短程序实际上只是一个函数调用,所以你需要测试将多个值传递给你的函数,然后测试响应,以确保你得到预测的结果。

在混合PHP伪代码中,这可能看起来如下:

require 'myfile.php'
class MyTest extends TestClass{
/**
* Provides parameters and expected results to the test method.
*/
public function providerOfTestCases(){
return [
'Googlebot Test Case' => [ 'Googlebot', true ],
'msnbot Test Case'    => [ 'mstbot'   , true ],
.
.
'nonbot test case'    => [ 'randomStringData', false ]
];
}
/**
* @dataProvider providerOfTestCases
*/
public function testBotDetector( $userString, $expectedResult ){
$functionResult = bot_detected( $userString );
$message_on_failure = "When testing $userString, we expect "
. ( $expectedResult ? "TRUE" : "FALSE" )
. " but instead the function outputs "
. ( $functionResult ? "TRUE" : "FALSE" );
$this->assertEquals( $expectedResult, $functionResult, $message_on_failure );
}
}

对于这样一个简单的函数,这个测试将告诉你你已经知道的,对于你的机器人名称列表中的每个字符串,你都会得到一个TRUE的结果。

除此之外,我还将在您的生产系统中添加一个日志记录功能,以跟踪所有测试的$USER值。像您编写的函数这样的函数最大的问题是它依赖于您预设的数据列表才能准确。没有办法预先测试您列出的值实际上是交付给系统的值。通过记录所有测试的值,您可以定期检查日志中应考虑的新值和可能的错误。

第二个过程依赖于@RiggsFilly对您原始帖子的评论。您的日志文件将只由实际的机器人访问填充,因此您必须耐心等待日志填充。定期检查日志,并确保您看到了期望看到的值。

记住在日志中包含函数输出的结果,这样您就可以对函数的性能进行三次检查。

我希望所有这些都有所帮助。编码快乐!

最新更新