跳转到内容

测试和调试

下面的命令都在你的电脑上用 yonto-plugin 运行。 它用同一个 QuickJS 引擎运行插件,yonto 全局对象和各项限制也和电视上一样,所以在这里能通过的插件,不会换到电视上就不行。

大多数命令可以传入插件所在的目录,不传就用当前目录。

终端窗口
yonto-plugin init my-site --template blank --name "My site"

用模板在 ./my-site 里生成一个新插件,并填好 id 和名称。 模板有 blank 和 video-blog,各自的用途见编写插件。

终端窗口
yonto-plugin lint

对照模式检查清单,构建文件,并算出代码实际需要的 contractVersion。 它不会发任何请求。 缺少必需的函数、allowedHosts 里有不可能是主机的条目、contractVersion 低于代码用到的版本,这些情况它都会拒绝。 contractVersion 高于所需的版本,则只给出警告。

lint 只读你的代码,不运行它。 通过变量调用宿主函数,或者用展开另一个对象的方式构造导出对象,它的判断会偏保守,所以尽量写得直白一些。

终端窗口
yonto-plugin run . search '"sourdough"'
yonto-plugin run . getMediaList '"latest"' '{"page":1}'

调用一个函数,打印它返回的 JSON 和发出的请求。 参数是 JSON,所以字符串要加两层引号。

终端窗口
yonto-plugin doctor

它像应用一样把插件走一遍:先取分类,再取列表和第 2 页,然后打开列表里的一个标题,接着搜索,最后调用插件导出的可选函数。 每一步都用上一步的结果当输入。 退出码可以供持续集成使用。

最重要的规则是:成功但结果为空,也算失败。 网站改了页面结构,插件看上去“正常”,却什么也不返回,也不报任何错。 doctor 把这种情况记为 EMPTY_RESULT。 对于应用会悄悄替换掉的值,比如 type: "MOVIE",它也会发出警告。

如果插件的 configSchema 里有必填字段,不提供设置就跑不起来。 把值写进插件旁边的 doctor.json,或者单次运行时设置 YONTO_PLUGIN_CONFIG='{"feedUrl":"…"}',后者优先。 值都必须是字符串,不接受数字,因为数字在这个宿主上能用,换到别的宿主上就不行。

doctor.json 会提交到仓库,所以只写测试用的数据,千万不要放真实的密钥。

终端窗口
yonto-plugin doctor --record
yonto-plugin doctor --replay

--record 把每个响应写进 fixtures/,每个 cookie 的值都会换成 redacted。 --replay 不联网,直接用这些数据作答。 对着真实网站录一次,之后改动一秒钟就能离线验证,克隆你插件的人也能这样验证。

需要会话 cookie 的网站无法录制,因为 cookie 绝不能提交。 这类插件请改用普通的单元测试,配合保存下来的页面来测。

命令行工具的引擎同时也是一个库,所以插件自己的逻辑也可以用 node --test 来测。 video-blog 模板在 kangzj/yonto-plugins 的 tools/plugin-cli/test/templates.test.js 里有一个最小的例子:回放录制数据,并用脚本化的传输层测试一个错误。 断言要针对规则,不要针对措辞。 比如测试错误时,检查原因里没有出现片源的名字,这样改写措辞也不会让测试失败。

用 python3 -m http.server 在该目录启动一个服务,然后在设置、插件、从网址安装里安装该插件 .js 文件的地址。 在 Android 模拟器里,电脑的地址是 10.0.2.2。 在真实的电视上,用电脑在局域网里的地址。 安装程序看的是内容,不看扩展名,所以直接用 .js 就行,不用打包。

安装被拒绝时,对话框会说明原因。 文件超过 1 MiB,或者下载超过 30 秒,都会被拒绝,而一个插件通常只有几十 KB。