Skip to content

内置单元测试

书源支持内置 TEST() 函数,用于开发阶段验证各项功能。CLI 和 GUI 调试面板均可执行测试。

TEST 函数

js
function TEST() {
  // 测试搜索
  var results = search('斗破苍穹', 1);
  assert(results.length > 0, '搜索应返回结果');
  assert(results[0].name, '结果应有 name 字段');
  assert(results[0].bookUrl, '结果应有 bookUrl 字段');
  legado.log('[TEST] 搜索通过,返回 ' + results.length + ' 条');

  // 测试书籍信息
  var info = bookInfo(results[0].bookUrl);
  assert(info.name, 'bookInfo 应返回 name');
  assert(info.tocUrl, 'bookInfo 应返回 tocUrl');
  legado.log('[TEST] 书籍信息通过');

  // 测试章节列表
  var chapters = chapterList(info.tocUrl);
  assert(chapters.length > 0, '应有章节');
  assert(chapters[0].name, '章节应有 name');
  assert(chapters[0].url, '章节应有 url');
  legado.log('[TEST] 章节列表通过,共 ' + chapters.length + ' 章');

  // 测试正文
  var text = chapterContent(chapters[0].url);
  assert(text && text.length > 100, '正文应有足够内容');
  legado.log('[TEST] 正文获取通过,长度 ' + text.length);
}

assert 辅助函数

书源中自行定义:

js
function assert(condition, message) {
  if (!condition) {
    throw new Error('断言失败: ' + (message || '未知'));
  }
}

CLI 执行

使用 --all 参数执行完整测试:

bash
cargo run -- booksource-test --source 我的书源 --all --keyword "斗破苍穹"

CLI 会依次调用 search → bookInfo → chapterList → chapterContent → explore,输出每项测试结果。

测试设计建议

最小化依赖

js
function TEST() {
  // 先测试基础网络是否通
  var html = legado.http.get(BASE);
  assert(html.length > 0, '首页应可访问');

  // 再测试具体功能
  var results = search('测试', 1);
  // ...
}

分步验证

js
function TEST() {
  legado.log('=== 开始测试 ===');

  legado.log('[1/4] 测试搜索...');
  var results = search('玄幻', 1);
  assert(results.length > 0, '搜索无结果');

  legado.log('[2/4] 测试书籍信息...');
  var info = bookInfo(results[0].bookUrl);
  assert(info.tocUrl, '缺少 tocUrl');

  legado.log('[3/4] 测试章节列表...');
  var chapters = chapterList(info.tocUrl);
  assert(chapters.length > 0, '无章节');

  legado.log('[4/4] 测试正文...');
  var text = chapterContent(chapters[0].url);
  assert(text.length > 50, '正文过短');

  legado.log('=== 全部通过 ===');
}

发现页测试

js
function TEST() {
  // 测试分类列表
  var cats = explore(1, 'GETALL');
  assert(Array.isArray(cats), 'GETALL 应返回数组');
  assert(cats.length > 0, '应有分类');
  legado.log('[TEST] 分类: ' + cats.join(', '));

  // 测试第一个分类
  var books = explore(1, cats[0]);
  assert(books.length > 0, '分类应有书籍');
  assert(books[0].name, '书籍应有 name');
}

常见断言模式

js
// 数组非空
assert(Array.isArray(arr) && arr.length > 0, '数组不应为空');

// 字符串非空
assert(str && str.trim().length > 0, '字符串不应为空');

// URL 格式
assert(url && (url.indexOf('http://') === 0 || url.indexOf('https://') === 0), '应为有效 URL');

// 数值范围
assert(count > 0 && count < 10000, '数量应在合理范围');

基于 MIT 许可发布