Frappe API 的界面测试

你可以编写集成测试,也可以直接使用 QUnit 在 JavaScript 中编写测试

QUnit 帮助你使用 QUnit 框架和原生 frappe API 编写 UI 测试。你可能已经猜到了,这是一种更快的测试编写方式。

测试运行器

要编写基于 QUnit 的测试,请将测试添加到应用程序的 tests/ui 文件夹中。测试文件必须以 test_ 开头,并以 .js 扩展名结尾。

要运行你的文件,你可以使用测试运行器。测试运行器提供了一个用户界面,用于加载所有 QUnit 测试并在浏览器中运行它们。

在 CI 中,所有 QUnit 测试都由测试运行器使用 frappe/tests/test_test_runner.py 运行

运行测试

要运行基于测试运行器的测试,请使用 run-ui-tests bench 命令,并传入你想运行的文件名。

bench run-ui-tests –test frappe/tests/ui/test_list.js

这会将文件名传递给 test_test_runner.py,它会在浏览器中加载所需的 JS 并执行测试

调试测试

要调试测试,你可以从 UI 中的测试运行器打开它,并手动运行以查看它究竟在哪里失败。

测试顺序

在 Frappe 中,UI 测试按固定顺序运行以确保依赖关系。

测试运行的顺序将在 tests/ui/tests.txt
文件中。

运行所有 UI 测试

要一起运行应用程序的所有 UI 测试,请运行

bench run-ui-tests –app [app_name]

这将逐一运行 tests/ui 文件夹中的所有文件。

QUnit 测试示例

以下是 QUnit 中 To Do 测试的示例

QUnit.test(“Test quick entry”, function(assert) {
assert.expect(2);
let done = assert.async();
let random_text = frappe.utils.get_random(10);

frappe.run_serially([
() => frappe.set_route(‘List’, ‘ToDo’),
() => frappe.new_doc(‘ToDo’),
() => frappe.quick_entry.dialog.set_value(‘description’, random_text),
() => frappe.quick_entry.insert(),
(doc) => {
assert.ok(doc && !doc.__islocal);
return frappe.set_route(‘Form’, ‘ToDo’, doc.name);
},
() => assert.ok(cur_frm.doc.description.includes(random_text)),

// Delete the created ToDo
() => frappe.tests.click_page_head_item(‘Menu’),
() => frappe.tests.click_dropdown_item(‘Delete’),
() => frappe.tests.click_page_head_item(‘Yes’),

() => done()
]);
});

使用 Promise 编写对测试友好的代码

Promise 是编写对测试友好的代码的好方法。如果你的方法调用了异步调用(ajax),那么你应该返回一个 Promise 对象。在编写测试时,如果你遇到一个不返回 Promise 对象的函数,你应该更新代码以返回一个 Promise 对象。