在过去的一年左右的时间里,我一直在哈斯克尔身边玩耍,我实际上已经开始'得到'它,直到Monads,Lenses,Type Families,......很多.
我即将离开这个舒适区,我正在转向OCaml项目作为日常工作.稍微研究一下语法,我正在寻找类似的更高级别的概念,例如functor.
我阅读了OCaml中的代码和仿函数的结构,但我似乎无法知道它们现在是否是Haskell和OCaml中的类似概念.简而言之,Haskell中的仿函数对我来说主要是一种在Haskell中提升函数的方法,我就是这样使用它(并且喜欢它).在OCaml中,它给我一种感觉,它更接近于编程到界面(例如,当使用比较函数创建一个集合或列表时),我真的不知道如何提升函数而不是仿函数.
有人可以解释我这两个概念是否相似,如果是这样,我错过了什么或没有看到什么?我用Google搜索了一下,似乎找不到明确的答案.
卡斯帕
我在java中有一个外观的集成测试,它做了一些事情,其中包括对弹性搜索数据库的索引操作.这个弹性搜索数据库已经非常天真地设置(开箱即用的东西实际上,我在学习fase).插入是在这个外观内部完成的,使用java api,也非常天真,示例几乎完全从弹性搜索中复制粘贴,如下所述:http://www.elasticsearch.org/guide/reference/java-api /index_.html.
然后我测试我的外观是否正确地完成了它的东西,其中一部分是检查该文档是否确实已插入数据库中.我再次按照弹性在其网站上描述的方式进行操作:http://www.elasticsearch.org/guide/reference/java-api/search.html.我插入一个带有特定负载的文档,并以相同的方式查找它.
如果我在调试中运行并在facade之后设置了一个断点,那么这个测试是有效的,但是如果我没有放置这个断点或者没有在调试中运行它会失败并且没有找到结果.这让我觉得我真的做错了什么.此外,应用程序本身工作(插入等),因此我的集成测试可能有问题,而不是我的复制粘贴代码.
我想在索引操作返回之后索引还没有真正完成,或者有一些复制在搜索之前没有完成,或类似的东西,但它让我想到了什么,我似乎无法让它解决.我没有尝试将弹性放在一个节点和一个碎片上,也许那里有一些错误,但我真的没看到究竟是什么,所以我还没走那条路.就像我说的,刚刚开始使用弹性,所以我可能会遗漏一些关键和初学者风格的东西.如果需要,我可以粘贴我的确切代码,但就像我说的那样归结为在测试中使用来自弹性搜索站点的两个代码片段.
卡斯帕
我有一个配置文件的maven pom.在其中一个配置文件中,我指的是这样的系统变量
<profile>
<id>kasper</id>
<properties>
<user>${username}</user>
</properties>
</profile>
Run Code Online (Sandbox Code Playgroud)
当我使用-Dusername = kasper调用maven命令行时,一切似乎都很好.
问题是,我在IntelliJ中导入了这个项目.IntelliJ 13允许通过Maven工具窗口选择要运行的配置文件.
当我选择在运行测试时使用这个特定的配置文件时,我似乎无法找到如何正确替换这个属性,即真正告诉IntelliJ它必须选择这个或那个用户名来运行我的maven测试,我试过了一切都没有,它似乎没有选择.
有人有想法吗?
卡斯帕
我一直在尝试使用cabal-install作为一种构建方式,更重要的是,测试我的haskell项目,与Maven在Java项目中使用的方式有点相似,主要是因为它似乎也是一种好方法.集成在Jenkins或ci左右,从某种意义上说它似乎非常可靠,你不需要开发环境等设置来检查和确认代码是否正在编译和纠正.
无论如何,我正在使用QuickCheck和HUnit.在另一篇文章 在这里堆栈交流我发现了一个很好的方式,通过使用功能测试中Distribution.TestSuite.HUnit建立在我的测试模块暴露试验阵列整合HUnit和阴谋.作品.
我尝试使用quickcheck进行相同的设置,
import qualified Distribution.TestSuite.QuickCheck2 as CabalQuickCheck
alwaysFalseOneArg::Int->(Int,Int)
alwaysFalseOneArg x = (x,x)
quickCheckPropOneArg = \s->let (a,b)=alwaysFalseOneArg s in a==b && a/=b
cabalQCTest = CabalQuickCheck.test "test" quickCheckPropOneArg
tests=cabalQCTest:[]
Run Code Online (Sandbox Code Playgroud)
我想看到这个测试失败了.
我与HUnit设置的cabal文件,HUnit测试正在运行,失败或没有失败,因为他们应该.但是,如果我使用相同的设置来执行quickcheck测试,cabal告诉我它确实找到了一个测试套件,但它没有测试.我尝试了在Distribution.TestSuite.QuickCheck2 网站上提到的方法,但是他们似乎没有提到如何公开测试,我似乎没有设法做到这一点.我现在有点不知所措,我可以用quickcheck本身运行那些quickcheck测试,但不能用cabal运行,我希望能够快速验证我的所有测试和代码并在Jenkins中使用它.有人有想法吗?
我试图提供我认为必要的所有信息,而不会过于复杂的东西,所以我没有发布完整的cabal文件等等,如果有必要,我当然会这样做.我发现了很多类似的帖子,但是大多数都归结为使用了除了详细的0.9之外的其他东西,这可能是一个遗憾,因为它似乎与HUnit作为一个设置很好地工作,我想同时使用HUnit和QuickCheck当然,以同样的方式,最好暴露一个包含HUnit和QuickCheck测试的测试数组.
卡斯帕
我有一个haskell应用程序的开始,我想看看构建工具的行为.我希望看到的一件事是Haskell覆盖报告,通过hpc(Haskell程序覆盖 - >我没有找到这个标签,hpc指向高性能计算,侧面说明).
我的应用程序的结构是
Main
src/
ModuleA
ModuleB
tests/
ModuleBTest
Run Code Online (Sandbox Code Playgroud)
我有moduleB的单元测试,我通过cabal测试运行这些单元测试.在此之前,我将cabal配置为通过吐出hpc数据
cabal configure --ghc-options=-fhpc --enable-tests
Run Code Online (Sandbox Code Playgroud)
然后我构建并测试,
cabal build
cabal test unit-tests (that's the name of the test suite in the cabal file)
Run Code Online (Sandbox Code Playgroud)
我确实看到了一份报告,一切似乎都很顺利.但是,moduleA不是在moduleB中引用的,它只是从Main引用的.我还没有为主模块进行测试.
问题是,我希望看到moduleA在hpc输出中弹出,完全以黄色突出显示,并且真的向我挥手说这个模块没有测试,但似乎并非如此.我注意到.mix文件是为这个'未使用的'模块创建的,所以我怀疑构建步骤没问题但是在cabal测试步骤中出错了.
如果我通过ghci并编译单元测试,同时在模块列表上显式moduleA进行编译,那么我确实得到hpc来告诉我该模块根本没有测试.所以我怀疑cabal在某个地方优化了这个模块A(因为它'未使用'),但我真的不知道如何或在哪里.
现在,我确实意识到这可能不是真实的生活情况,因为moduleA仅在main方法中引用,moduleB不引用moduleA而我不测试Main模块(还),但我仍然会如果它至少在计划覆盖范围中显示为我的测试中的一个洞,就像战舰的大小一样,感觉好多了.有人有想法吗?
注意:我意识到我的问题可能归结为:"我如何告诉cabal不要优化未使用的模块?" 但我想提出完整的问题.
卡斯帕
我们有一些ocaml代码,模块之间有很多硬耦合依赖.最近,我们一直在转向仿函数方法来解耦这些模块,所以如果我们有模块A依赖于模块B和C,我们在声明中这样做:
module A: (B:B_Signature) (C:C_Signature) = struct ... end
Run Code Online (Sandbox Code Playgroud)
像这样,我们可以在模块A中注入"模拟"B或C模块,回答这些签名,进行单元测试,并且仍然可以创建包含真实B和C模块的生产模块.问题是,现在我们必须手动输入这些模拟的模块,这是一个阻塞,因为它通常是装载样板.
所以,我正在寻找一种从ocaml模块生成"模拟"模块的方法,而不是手工输入.我的意思是,如果我有一个具有一些功能的模块,具有以下签名
module type A =
sig
val f: string -> int -> string
val g: string -> string -> int
end
Run Code Online (Sandbox Code Playgroud)
我想生成一个模拟实现,例如像这样
module A_mock =
struct
let f _s _i =
""
let g _s1 _s2 =
0
end
Run Code Online (Sandbox Code Playgroud)
所以,这是一个具有两个函数的模块,具有相同的签名,但是f和g的实现忽略了它们的参数并且默认返回,函数f的空字符串和函数g的0.
那些默认值,空字符串和零,只是一个例子.我知道我希望最终可以配置这个,我想创建模拟并指定某些函数的返回值,甚至可以检查调用模拟函数的参数等等,但是就目前而言,对于这个简单的案例,我正在寻找一种解决方案,而不是手动输入和实现这一点.
我没有找到任何为OCaml执行此操作的框架.
我试图通过camlp4和代码生成找出这可能是怎么做的,但文档似乎有点限制,我真的不知道它是否有可能.
那么,我的问题是,是否有人知道一个框架,或者是否有代码生成方式从OCaml中的签名创建这种样板模块?
卡斯帕