请在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的hash-map。但我卡在如何将这些函数组合起来以工作作为一个测试框架,如果我把它们放在某个函数内,那么如果某些步骤失败,执行将继续到下一个步骤,并且失败的步骤的结果将会丢失。之后,我决定编写宏,把所有函数转换成列表,逐个评估它们并返回每个步骤的详细结果。但我失败了(即便是在ChatGPT的帮助下),也许因为我Clojure新手。

在可能的一周内无法解决这个问题后,我认为可能我做错了什么。也许有人能帮我解决这个API问题?

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

我受这个框架的启发,我只是觉得用它配合REPL写测试会更容易,然后在测试里做些Clojure魔术:

谢谢!

作者:
听起来像你有一个设计问题,而且很难直接回答,因为最好的答案取决于你希望这个“测试库”如何工作。

以下有两个可能有助于你解决问题的方法

1)看看`clojure.test`是如何实现的,那里可能有一些有用的想法。 https://github.com/clojure/clojure/blob/clojure-1.11.1/src/clj/clojure/test.clj - 只有800行。第706行及之后是处理测试执行运行时的一些行。

2)我会建议将你的测试流程看作是一个数据结构

```
(def test-flow
    [[启动-app "some.app.id"]
     [断言-可见 "Login"]
     [输入-文本 "admin"]
     [点击 "unlockButton"]
     [断言-可见 "HomeScreen"]])
```

然后在上面写一些函数来控制执行并监控结果。一旦你有对你有用的数据结构,如果你需要的话,可以写一个宏来处理引号。重点放在易于调试的上面。

登录注册来回答这个问题。

...