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.

139 lines
4.5 KiB

"""
test_main.py - 单元测试主模块的功能。
"""
import unittest
from unittest.mock import patch, MagicMock
import pandas as pd
from main import (
search_videos,
get_cid,
get_danmaku,
parse_danmaku,
save_danmakus_to_excel
)
class TestMain(unittest.TestCase):
"""
测试主模块的单元测试类。
"""
@patch('main.requests.get')
def test_search_videos_success(self, mock_get):
"""
测试根据关键词搜索视频并成功返回视频 ID 列表。
"""
# 模拟返回的 HTML 内容
mock_html = '''
<div class="bili-video-card">
<a href="//www.bilibili.com/video/123456/"></a>
</div>
<div class="bili-video-card">
<a href="//www.bilibili.com/video/789012/"></a>
</div>
'''
mock_get.return_value = MagicMock(status_code=200, text=mock_html)
# 调用搜索函数
video_ids = search_videos("2024巴黎奥运会", max_results=2)
# 期望返回的结果
self.assertEqual(video_ids, ['123456', '789012'])
@patch('main.requests.get')
def test_search_videos_failure(self, mock_get):
"""
测试根据关键词搜索视频时请求失败。
"""
mock_get.return_value = MagicMock(status_code=404)
# 调用搜索函数
video_ids = search_videos("2024巴黎奥运会", max_results=2)
# 期望返回空列表
self.assertEqual(video_ids, [])
@patch('main.requests.get')
def test_get_cid_success(self, mock_get):
"""
测试根据视频 ID 获取弹幕 CID 成功。
"""
mock_html = '{"cid":123456}'
mock_get.return_value = MagicMock(status_code=200, text=mock_html)
cid = get_cid("123456")
# 期望返回的 CID
self.assertEqual(cid, '123456')
@patch('main.requests.get')
def test_get_cid_failure(self, mock_get):
"""
测试根据视频 ID 获取弹幕 CID 失败。
"""
mock_get.return_value = MagicMock(status_code=404)
cid = get_cid("123456")
# 期望返回 None
self.assertIsNone(cid)
@patch('main.requests.get')
def test_get_danmaku_success(self, mock_get):
"""
测试根据视频 ID 和 CID 获取弹幕数据成功。
"""
mock_danmaku_xml = '<i><d p="0,1,25,16777215,0,0,0,0">弹幕内容</d></i>'
mock_get.return_value = MagicMock(status_code=200, content=mock_danmaku_xml.encode('utf-8'))
danmaku = get_danmaku("123456", "123456")
# 期望返回的弹幕 XML 内容
self.assertEqual(danmaku, mock_danmaku_xml.encode('utf-8'))
@patch('main.requests.get')
def test_get_danmaku_failure(self, mock_get):
"""
测试根据视频 ID 和 CID 获取弹幕数据失败。
"""
mock_get.return_value = MagicMock(status_code=404)
danmaku = get_danmaku("123456", "123456")
# 期望返回 None
self.assertIsNone(danmaku)
def test_parse_danmaku(self):
"""
测试解析弹幕 XML 内容,提取弹幕文本。
"""
xml_content = '<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>'
result = parse_danmaku(xml_content)
# 期望返回的弹幕列表
self.assertEqual(result, ['弹幕内容1', '弹幕内容2'])
def test_save_danmakus_to_excel(self):
"""
测试将弹幕数据保存到 Excel 文件中。
"""
all_danmakus = ['弹幕内容1', '弹幕内容2']
filename = "test_danmakus.xlsx"
# 调用保存函数
save_danmakus_to_excel(all_danmakus, filename)
# 读取保存的文件并验证内容
data_frame = pd.read_excel(filename)
self.assertEqual(list(data_frame['弹幕内容']), all_danmakus)
def test_save_danmakus_to_excel_empty(self):
"""
测试保存空的弹幕列表到 Excel 文件的功能。
"""
all_danmakus = []
filename = "empty_danmakus.xlsx"
# 调用保存函数
save_danmakus_to_excel(all_danmakus, filename)
# 验证保存的文件是否为空
data_frame = pd.read_excel(filename)
self.assertEqual(len(data_frame), 0)
if __name__ == '__main__':
unittest.main() # 执行测试