基于GitHub Actions在GitHub上测试Scrapy Spider Contracts
解决方案建议
方案一:使用Python内置HTTP服务器(最推荐)
直接用Python自带的http.server模块启动轻量服务器,完全不需要额外Docker镜像,和Python环境完美兼容,资源消耗极低,适配GitHub Actions场景。
操作步骤
- 将测试用HTML文件放在项目内指定目录,比如
tests/test_html/ - 在GitHub Actions工作流中,先后台启动HTTP服务器,再执行Scrapy Contract测试
- 工作流配置示例:
name: Test Scrapy Contracts on: [pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.11' # 替换为你项目使用的Python版本 - name: Install dependencies run: | python -m pip install --upgrade pip pip install scrapy # 安装项目其他依赖 - name: Start local HTTP server run: | python -m http.server 8000 --directory tests/test_html & # 短暂等待服务器启动完成 sleep 2 - name: Run Scrapy Spider Contracts run: | scrapy check <你的爬虫名称>
说明
python -m http.server 8000 --directory tests/test_html:指定测试HTML文件所在目录,在8000端口启动服务- 后台运行(
&)配合sleep 2确保服务器就绪 - 需将Scrapy爬虫中的请求地址改为
http://127.0.0.1:8000/website.html
方案二:修改爬虫直接读取本地文件(适合无HTTP依赖的测试)
如果你的Spider Contracts不需要真实HTTP请求,可以调整爬虫代码,直接读取本地HTML文件生成Response对象,完全无需服务器:
爬虫代码示例
from scrapy.http import HtmlResponse class MySpider(scrapy.Spider): name = 'myspider' def start_requests(self): # 本地测试模式下读取文件,生产环境走真实请求 if self.settings.get('LOCAL_TEST'): with open('tests/test_html/website.html', 'r', encoding='utf-8') as f: html_content = f.read() response = HtmlResponse( url='http://example.com/website.html', # 仅用于Contract校验的占位URL body=html_content.encode('utf-8'), encoding='utf-8' ) yield scrapy.Request( url='http://example.com/website.html', callback=self.parse, meta={'dont_filter': True} ) else: # 生产环境真实请求逻辑 yield scrapy.Request(url='https://real-website.com', callback=self.parse)
GitHub Actions配置
- name: Run Scrapy Spider Contracts run: | scrapy check <你的爬虫名称> env: LOCAL_TEST: true
这个方案零资源消耗,但需要调整爬虫代码,适合对HTTP协议细节无要求的测试场景。
方案三:同一工作流中同时使用Python和Docker(适配Apache依赖场景)
如果必须依赖Apache的特定行为(比如.htaccess规则、特定MIME类型),可以在同一个工作流中同时运行Python环境和Apache容器,通过Docker网络实现互通:
工作流配置示例
name: Test Scrapy Contracts on: [pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Start Apache container run: | docker run -d \ -p 8080:80 \ -v ${{ github.workspace }}/tests/test_html:/usr/local/apache2/htdocs/ \ httpd:2.4 # 等待容器启动就绪 sleep 3 - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.11' - name: Install dependencies run: | python -m pip install --upgrade pip pip install scrapy - name: Run Scrapy Spider Contracts run: | scrapy check <你的爬虫名称> env: TEST_URL: http://127.0.0.1:8080/website.html
说明
- 通过
docker run将本地测试HTML目录挂载到Apache的htdocs目录,映射8080端口 - Python环境可通过
127.0.0.1:8080访问Apache服务,解决你之前的环境二选一问题
总结推荐
优先选择方案一,轻量、无额外依赖、与Python环境无缝集成,完美解决资源消耗和环境冲突问题;若测试无需HTTP协议细节,方案二是零资源消耗的最优解。
内容的提问来源于stack exchange,提问作者sebap123
相关产品推荐
相关产品推荐

