Closed. This question needs to be more focused。它当前不接受答案。
想要改善这个问题吗?更新问题,使它仅关注editing this post的一个问题。
2年前关闭。
Improve this question
两者看起来都不错。我想了解每个库特别擅长或缺乏的东西,尤其是对于Web应用程序的测试。 我想对这个函数做些什么?在系统世界中,有什么好的方法可以考虑此功能的作用? 在这样做的过程中,还有哪些其他功能会有用-将捕获该域的重要部分-以及我想对它们做出哪些真实陈述?
然后,以典型的 mock 者风格,您将自上而下或由内而外进行开发,从而在您从错误中恢复或拥有更好的主意时可以进行不可避免的迭代。
最终结果将是大量的功能,它们之间的相互关系由测试或(如Midje所称的)有关功能及其所依赖功能的“事实”记录下来。许多人评论说Midje对它具有Prolog/逻辑编程的感觉,这不是偶然的。与往常一样,测试只是示例,但Midje试图使它们读起来更像真相。这就是其唯一实际具有创新性的特征,即元常量。这是他们的一个例子:
在这种情况下,实际位置与
该测试明确说明了对人最重要的内容,也明确表示了不重要的内容(除了两个名字之外的任何东西)。
用数学术语来说,Midje试图让您像“对于所有x x x ...”这样的语句,同时仍然是测试工具而不是定理证明者。
这种方法的灵感来自Growing Object-Oriented Software中描述的那种“伦敦式”的模拟量很大的TDD,这是我通常在编写Ruby代码时使用的方法。但是事实证明,这种感觉有很大的不同,很难描述。但是感觉需要更多的工具支持,而不仅仅是
结果是,Midje在某种程度上试图找到一种功能性TDD风格,而不仅仅是OO TDD的一部分。它也试图成为通用工具,但它是半优化软件。正如亚伯拉罕·林肯(Abraham Lincoln)所说:“那些喜欢这种东西的人会发现他们喜欢的那种东西。”
想要改善这个问题吗?更新问题,使它仅关注editing this post的一个问题。
2年前关闭。
Improve this question
两者看起来都不错。我想了解每个库特别擅长或缺乏的东西,尤其是对于Web应用程序的测试。
最佳答案
我没有使用speclj,我是Midje的第一作者。其他人没有提到的一点是,Midje试图利用功能性语言和面向对象的语言之间的差异。
一个区别是不变性。由于大多数函数仅取决于其输入,而不取决于所包含的状态,因此您对它们所做的真相声明的感觉与面向对象的同类不同。在OO测试中,您将以以下形式创建示例:“鉴于此历史记录和这些输入,此方法会产生这样的结果。”
用功能语言编写的示例似乎更简单一些:“给出这些输入,该函数就这样返回”。但是我认为那是不对的。我认为系统中的其他功能起着类似于状态/历史的作用:它们是您试图获得智力控制的事情之一。功能及其关系是您希望测试帮助您清楚考虑的事物。
出于这个原因,Midje的编写假设是一个甜美的开发过程涉及到以下内容:
然后,以典型的 mock 者风格,您将自上而下或由内而外进行开发,从而在您从错误中恢复或拥有更好的主意时可以进行不可避免的迭代。
最终结果将是大量的功能,它们之间的相互关系由测试或(如Midje所称的)有关功能及其所依赖功能的“事实”记录下来。许多人评论说Midje对它具有Prolog/逻辑编程的感觉,这不是偶然的。与往常一样,测试只是示例,但Midje试图使它们读起来更像真相。这就是其唯一实际具有创新性的特征,即元常量。这是他们的一个例子:
(fact "right changes the direction, but not the position"
(right (snapshot north ...position...)) => (snapshot west ...position...)
(right (snapshot east ...position...)) => (snapshot north ...position...)
(right (snapshot south ...position...)) => (snapshot east ...position...)
(right (snapshot west ...position...)) => (snapshot south ...position...))
在这种情况下,实际位置与
right
函数的正确性无关,只是它永远不会改变。元常量的概念是,它是一个值,除了测试中明确说明的内容外,什么都不知道。在测试中,很多时候很难说出什么是必需的,什么是偶然的。这会带来许多不利影响:理解,可维护性等。元常量可提供清晰度。如果值是包含键3
的值:a
的映射或记录很重要,则可以明确地说:(fact
(full-name ..person..) => "Brian Marick"
(provided
..person.. =contains=> {:given-name "Brian", :family-name "Marick"}))
该测试明确说明了对人最重要的内容,也明确表示了不重要的内容(除了两个名字之外的任何东西)。
用数学术语来说,Midje试图让您像“对于所有x x x ...”这样的语句,同时仍然是测试工具而不是定理证明者。
这种方法的灵感来自Growing Object-Oriented Software中描述的那种“伦敦式”的模拟量很大的TDD,这是我通常在编写Ruby代码时使用的方法。但是事实证明,这种感觉有很大的不同,很难描述。但是感觉需要更多的工具支持,而不仅仅是
with-redefs
。结果是,Midje在某种程度上试图找到一种功能性TDD风格,而不仅仅是OO TDD的一部分。它也试图成为通用工具,但它是半优化软件。正如亚伯拉罕·林肯(Abraham Lincoln)所说:“那些喜欢这种东西的人会发现他们喜欢的那种东西。”
关于clojure - Midje和Speclj相比如何?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12928250/
10-12 03:14