2

Lein test以随机顺序运行我的函数。

我有两个修改相同数据的函数。我需要第一个先运行,然后第二个运行。我的测试文件中的顺序

例子:

;;===============my file=============
;;this fails if x and y are not found.
(defn create-data [x y]
  (go add x y))

;;if the update function doesn't find x and y it adds them so create-data fails when it runs after update-data
(defn update-data [x y]
  (go update x y))

;;======my file test=======
(deftest create-test
  (testing "this should run first"
   (is (= 20 create-data)))

(deftest create-test
  (testing "this should run second"
   (is (= 20 update-data)))

所以我认为为这两个函数创建一个测试会使其工作,但它没有。

(deftest test-create-update.
  (testing "this should run second"
    (is (= 20 create-data))
    (is (= 20 update-data)))

我想要的东西可以同时运行这两个函数,但肯定会首先运行 create-data,并且无论结果如何(无论是通过还是失败)都将运行 update-data。我的测试中都需要。他们单独工作。但我需要自动化测试。

4

2 回答 2

3

您可以使用测试装置来创建和拆除测试环境。这可以针对所有测试进行,也可以针对每个单独的测试进行。

请参阅使用装置

; Here we register my-test-fixture to be called once, wrapping ALL tests 
; in the namespace
(use-fixtures :once my-test-fixture)

如果要对多个命名空间强制执行顺序,可以将它们包装在my-test-fixture.

于 2016-03-23T22:55:21.697 回答
1

您为这两个功能创建一个测试的直觉是一种很好的方法。您遇到的问题很可能与测试无关。

您发布的代码(go add x y)建议您使用 core.async。有一些问题:

  1. go 块返回一个通道,并且其中的代码“稍后”执行,因此除非您阻止结果,否则不能保证任何事情都发生了。
  2. (go add x y)不执行任何功能,它只返回 y。你可能想要(!< (go (add x y)))
  3. 除非 add 通过 atom 或 ref 或类似的方式修改某些状态,否则什么都不会改变。

我相信这里真正的问题在于代码,而不是测试。或者如果代码“有效”,那是因为你的测试没有阻塞。您能否提供更多关于您的上下文中的内容go和内容的详细信息?add

于 2016-03-24T03:55:58.770 回答