2024 Clojure 状态调查中分享您的想法!

欢迎!请参阅关于页面了解更多关于如何使用本站的信息。

0
Clojure
编辑

我想创建一种测试库或框架。它的主要目的是在 Android 设备上运行 UI 测试。例如,这是我希望它看起来像的例子

(test-flow
    (launch-app "some.app.id")
    (assert-visible "Login")
    (type-text "admin")
    (tap-on "unlockButton")
    (assert-visible "HomeScreen"))

我希望这个 API 看起来既好又清晰。基本来说,它原本应该做的是
- 使用 ID 为 "some.app.id" 的应用程序
- 检查屏幕上是否有名为 "Login" 的登录字段可见
- 在登录字段中输入文本 "admin"
- 点击解锁按钮
- 检查文本 "HomeScreen" 是否可见,这意味着我们成功登录。

我已创建了上述所有所需函数,那部分很简单。我将它们设计成返回一个可能包含 :result:error 的哈希表。但我不知道如何将这些函数结合在一起,使它们作为一个测试框架工作。如果我将它们放在某个函数内部,那么如果某个步骤失败,执行将继续到下一个步骤。此外,失败步骤的结果将被丢失。之后,我决定写一个宏,将所有函数转换为列表,逐个评估它们,并返回每个步骤的详细结果。但我失败了(即使是在 ChatGPT 的帮助下),也许是因为我是 Clojure 的菜鸟。

在可能持续一周无法解决这个问题后,我认为可能是我做错了什么。也许有人可以帮助我解决这个问题?

这是我对这个 API 的看法
- 测试的结果应该包含所有执行步骤(函数)的结果
- 如果某个步骤失败,则执行应停止,并返回所有执行步骤的结果。

这个框架给了我灵感,我只是认为使用 REPL 编写这样的测试并且在进行测试时进行一些 Clojure 魔法会更容易一些。

谢谢!

我认为你遇到了一个设计问题,这很难直接回答,因为最好的答案取决于你期待这个“测试库”如何工作。

可能有助于以下两个想法

1) 看一下 `clojure.test` 的实现。那里可能有对你有帮助的想法。[https://github.com/clojure/clojure/blob/clojure-1.11.1/src/clj/clojure/test.clj](https://github.com/clojure/clojure/blob/clojure-1.11.1/src/clj/clojure/test.clj) - 只有800行。第706行及之后的代码处理测试的运行时执行。

2) 我建议将你的测试流程视为一个数据结构

```
(def test-flow
    [[启动应用程序 "some.app.id"]
     [断言可见 "登录"]
     [输入文本 "admin"]
     [点击 "unlockButton"]
     [断言可见 "首页"]])
```

然后编写操作该数据结构的函数以以受控方式进行执行并监控结果。得到适合你的数据结构后,根据需要编写宏来处理引用。专注于易于调试的东西。

登录注册,以回答此问题。

...