You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
4.1 KiB
102 lines
4.1 KiB
import unittest
|
|
from unittest.mock import patch, MagicMock
|
|
from crawl_getthread import BiliBiliDanMu, search_videos, download_danmu, getthread
|
|
import os
|
|
|
|
class TestBiliBiliDanMu(unittest.TestCase):
|
|
"""
|
|
测试 BiliBiliDanMu 类的单元测试类。
|
|
"""
|
|
|
|
@patch('crawl_getthread.requests.get')
|
|
def test_get_video_cid_success(self, mock_get):
|
|
"""
|
|
测试根据视频 BV 号获取弹幕 CID 成功。
|
|
"""
|
|
mock_get.return_value = MagicMock(status_code=200, text='{"cid":123456}')
|
|
danmu_crawler = BiliBiliDanMu("BV12345", "test_output.txt")
|
|
self.assertEqual(danmu_crawler.get_video_cid(), "123456")
|
|
|
|
@patch('crawl_getthread.requests.get')
|
|
def test_get_video_cid_failure(self, mock_get):
|
|
"""
|
|
测试根据视频 BV 号获取弹幕 CID 失败。
|
|
"""
|
|
mock_get.return_value = MagicMock(status_code=404)
|
|
danmu_crawler = BiliBiliDanMu("BV12345", "test_output.txt")
|
|
self.assertIsNone(danmu_crawler.get_video_cid())
|
|
|
|
@patch('crawl_getthread.requests.get')
|
|
def test_get_content_success(self, mock_get):
|
|
"""
|
|
测试根据弹幕 XML URL 获取弹幕内容成功。
|
|
"""
|
|
mock_get.return_value = MagicMock(status_code=200, text='<d>弹幕内容</d>')
|
|
danmu_crawler = BiliBiliDanMu("BV12345", "test_output.txt")
|
|
self.assertEqual(danmu_crawler.get_content("http://comment.bilibili.com/123456.xml"), '<d>弹幕内容</d>')
|
|
|
|
@patch('crawl_getthread.requests.get')
|
|
def test_get_content_failure(self, mock_get):
|
|
"""
|
|
测试根据弹幕 XML URL 获取弹幕内容失败。
|
|
"""
|
|
mock_get.return_value = MagicMock(status_code=404)
|
|
danmu_crawler = BiliBiliDanMu("BV12345", "test_output.txt")
|
|
self.assertIsNone(danmu_crawler.get_content("http://comment.bilibili.com/123456.xml"))
|
|
|
|
def test_extract_danmu(self):
|
|
"""
|
|
测试解析弹幕 XML 内容,提取弹幕文本。
|
|
"""
|
|
danmu_crawler = BiliBiliDanMu("BV12345", "test_output.txt")
|
|
content_str = '<i><d p="0,1,25,16777215,0,0,0,0">弹幕内容1</d><d p="0,1,25,16777215,0,0,0,0">弹幕内容2</d></i>'
|
|
self.assertEqual(danmu_crawler.extract_danmu(content_str), ['弹幕内容1', '弹幕内容2'])
|
|
|
|
def test_save(self):
|
|
"""
|
|
测试保存弹幕到文件。
|
|
"""
|
|
danmu_crawler = BiliBiliDanMu("BV12345", "test_output.txt")
|
|
danmu_crawler.save(['弹幕内容1', '弹幕内容2'])
|
|
with open("test_output.txt", 'r', encoding='utf-8') as f:
|
|
self.assertEqual(f.readlines(), ['弹幕内容1\n', '弹幕内容2\n'])
|
|
os.remove("test_output.txt") # 清理测试文件
|
|
|
|
@patch('crawl_getthread.search_videos')
|
|
def test_search_videos_success(self, mock_search_videos):
|
|
"""
|
|
测试根据关键词搜索视频并成功返回视频 ID 列表。
|
|
"""
|
|
mock_search_videos.return_value = ['BV12345', 'BV67890']
|
|
video_ids = search_videos("2024巴黎奥运会", max_results=2)
|
|
self.assertEqual(video_ids, ['BV12345', 'BV67890'])
|
|
|
|
@patch('crawl_getthread.search_videos')
|
|
def test_search_videos_failure(self, mock_search_videos):
|
|
"""
|
|
测试根据关键词搜索视频时请求失败。
|
|
"""
|
|
mock_search_videos.return_value = []
|
|
video_ids = search_videos("2024巴黎奥运会", max_results=2)
|
|
self.assertEqual(video_ids, [])
|
|
|
|
@patch('crawl_getthread.download_danmu')
|
|
def test_download_danmu(self, mock_download):
|
|
"""
|
|
测试下载指定 BV 号视频的弹幕。
|
|
"""
|
|
mock_download.return_value = None
|
|
download_danmu(0, "BV12345", "test_output.txt")
|
|
mock_download.assert_called_with(0, "BV12345", "test_output.txt")
|
|
|
|
@patch('crawl_getthread.getthread')
|
|
def test_getthread(self, mock_getthread):
|
|
"""
|
|
测试使用线程池并发下载弹幕。
|
|
"""
|
|
mock_getthread.return_value = None
|
|
getthread()
|
|
mock_getthread.assert_called_once()
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main() # 执行测试 |