如何对Web抓取服务php单元进行单元测试

时间:2020-08-17 21:42:20

标签: php laravel unit-testing web-scraping goutte

我目前正在用PHP + Laravel开发一个项目,该项目需要从两个不同的网站上抓取数据。我正在使用Goutte剪贴库。我有10个集成测试,在这里我使用Goutte客户端提供的Crawler对象,以获取要从每个网站抓取的特定数据。

测试工作得很好(我什至使用感染库进行了突变测试)...但是事实是,我认为可以对所有功能进行单元测试(因此,测试运行速度更快)。< / p>

我尝试遵循的方法是从两个网站中的每个网站上抓取所有html文件,并断言所抓取的html等于我在项目中本地拥有的本地html文件,并且该HTML文件与报废了。因此,如果我的本地html和报废的html相同,则可以将数据从本地html传递给以特定html标签为目标的函数,以检索所需的信息。我希望这有道理

我希望我的代码能给大家带来更多启发:

我的测试类如下:

    private $html;
    
    protected function setUp() :void
    {
        $myHtml= fopen("path\myLocal.html", "r");
        $this->html =  fread($myHtml, filesize("path\myLocal.html"));
        fclose($myHtml); 
    }

    public function test_webScrapping_returns_html()
    {
        $scrapper = new WebScraping();
        $url = "www.the-url-I-wanna-scrape.com";
    
        $scrappedHtml= $scrapper->getHtml($url);
            
        $this->assertTrue($scrappedHtml=== $this->html);
            
    }

WebScraping模型的getHtml()函数如下所示:

    public function getHtml(string $url)
    {
        $client = new Client(); //I know that I should not intantiate the Goutte Client here (inject in __constructor intead?)
        $html = $client->request('GET', $url)->html();
        
        return $html;
    }

问题是,如果我dd($this->html)dd($scrappedHtml),内容几乎是相同的……唯一的区别是,\n\r相互穿插另一个没有。所以...两个HTML都具有相同的内容,但我不能断言它们是相等的。我所缺少的???我是在正确的道路上吗?还是您会采取完全不同的方法?

0 个答案:

没有答案