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

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() # 执行测试