当前位置: 首页 > 面试题库 >

Scrapy Unit的单元测试

查飞星
2023-03-14
问题内容

我想在Scrapy(屏幕抓取工具/网络抓取工具)中实现一些单元测试。由于项目是通过“ scrapy crawl”命令运行的,所以我可以通过诸如“鼻子”之类的东西来运行它。由于scrapy建立在扭曲之上,我可以使用其单元测试框架Trial吗?如果是这样,怎么办?否则,我想获得的鼻子工作。

更新:

我一直在谈论Scrapy-Users,我想我应该“在测试代码中构建Response,然后使用该响应调用该方法并断言[I]在输出中获得了预期的项目/请求”。我似乎无法使它正常工作。

我可以在测试中构建单元测试类:

创建一个响应对象
尝试使用响应对象调用我的Spider的parse方法
但是,最终会生成此回溯。为什么有任何见解?


问题答案:

我这样做的方法是创建虚假响应,这样你就可以脱机测试解析函数。但是你可以通过使用真实的HTML获得真实的情况。

这种方法的问题是你的本地HTML文件可能无法反映在线的最新状态。因此,如果HTML在线更改,你可能会遇到一个大错误,但是你的测试用例仍会通过。因此,这可能不是测试此方法的最佳方法。

我当前的工作流程是,每当出现错误时,我都会使用url向管理员发送电子邮件。然后针对该特定错误,创建一个html文件,其中包含引起错误的内容。然后,我为此创建一个单元测试。

这是我用来创建示例Scrapy http响应以从本地html文件进行测试的代码:

# scrapyproject/tests/responses/__init__.py

import os

from scrapy.http import Response, Request

def fake_response_from_file(file_name, url=None):
    """
    Create a Scrapy fake HTTP response from a HTML file
    @param file_name: The relative filename from the responses directory,
                      but absolute paths are also accepted.
    @param url: The URL of the response.
    returns: A scrapy HTTP response which can be used for unittesting.
    """
    if not url:
        url = 'http://www.example.com'

    request = Request(url=url)
    if not file_name[0] == '/':
        responses_dir = os.path.dirname(os.path.realpath(__file__))
        file_path = os.path.join(responses_dir, file_name)
    else:
        file_path = file_name

    file_content = open(file_path, 'r').read()

    response = Response(url=url,
        request=request,
        body=file_content)
    response.encoding = 'utf-8'
    return response

样本html文件位于scrapyproject / tests / responses / osdir / sample.html中

然后,测试用例可能如下所示:测试用例的位置为scrapyproject / tests / test_osdir.py

import unittest
from scrapyproject.spiders import osdir_spider
from responses import fake_response_from_file

class OsdirSpiderTest(unittest.TestCase):

    def setUp(self):
        self.spider = osdir_spider.DirectorySpider()

    def _test_item_results(self, results, expected_length):
        count = 0
        permalinks = set()
        for item in results:
            self.assertIsNotNone(item['content'])
            self.assertIsNotNone(item['title'])
        self.assertEqual(count, expected_length)

    def test_parse(self):
        results = self.spider.parse(fake_response_from_file('osdir/sample.html'))
        self._test_item_results(results, 10)

基本上,这就是我测试解析方法的方式,但不仅限于解析方法。



 类似资料:
  • 单元测试涉及测试软件应用程序的每个单元或单个组件。这是第一级软件测试。单元测试的目的是验证单元组件的性能。 单元是软件系统的单个可测试部分,并在应用程序软件的开发阶段进行测试。 此测试旨在测试隔离代码的正确性。单元组件是应用程序的单独功能或代码。白盒测试方法用于单元测试,通常由开发人员完成。 在测试级别层次结构中,单元测试是在集成和其他剩余测试级别之前完成的第一级测试。它使用模块进行测试,减少了等

  • 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如 C 语言中单元指一个函数,Java 里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进

  • 我们从 Hello World 项目入手,增加单元测试功能。 我们新家了一个名为hello-world-test的 Gradle 项目。 环境 Gradle 3.4.1 Spring Boot 1.5.2.RELEASE Thymeleaf 3.0.3.RELEASE Thymeleaf Layout Dialect 2.2.0 Spring Security Test 4.2.2.RELEASE

  • 单元测试验证单个代码单元是否按预期工作。 也就是说,给定不同的输入参数, 测试验证类方法返回预期结果。 单元测试通常由编写待测试类的人开发。 Yii的单元测试框架 Codeception 基于 PHPUnit,Codeception 建议遵从 PHPUnit 的文档的进行开发: Codeception for Yii framework Codeception Unit Tests PHPUnit

  • 单元测试 ClojureScript 的测试和 Clojure 语法类似, 通过 cljs.test 来提供. 首先需要引用下面这些函数或者 Macros: (ns my-project.tests (:require [cljs.test :refer-macros [deftest is testing run-tests]])) 然后可以定义一个测试: (deftest test-num

  • Mpx 会生成源码与最终产物包的映射关系,结合微信小程序提供的 miniprogram-simulate 来进行单元测试的工作。 因为目前仅微信提供了仿真工具,暂时只支持微信小程序平台的单元测试。如果需要 E2E 测试,则和框架无关了,可参考微信的小程序自动化。 简单的断言 组件必须是被项目真实使用的,且经过一次构建才可被测试。构建时 MpxPlugin 的配置信息中要将 generateBuil

  • 与其他应用程序一样,作为批处理任务的一部分去编写单元测试用例是非常重要的。Spring核心文档极其详尽的描述了如何使用用单元测试和集成测试,所以这里就不再重复。然而,思考一下点对点的批处理任务是很重要的,这是本章的重点。spring-batch-test项目包含的类,将有助于使点到点的测试方法更容易。

  • 软件系统的开发是一个很复杂的过程,随着系统复杂性的提高,代码中隐藏的 bug 也可能变得越来越多。为了保证软件的质量,测试是一个必不可少的部分,甚至还有测试驱动开发(Test-driven development, TDD)的理念,也就是先测试再编码。 在计算机编程中,单元测试(Unit Testing)又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作,所谓的单元是指