- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否有任何事件可以在每个属性案例之前运行,以便我可以为属性的每次运行运行设置和拆卸?
我希望能够使用属性测试配对行为,例如“我总是可以获取书面记录”或“readAllLines 的输出等于 writeAllLines 的输入”。我还希望该属性不关心操作集的实现方式(即是否需要清理任何资源)。
属性的每次运行都应该
我正在使用 FsCheck 和 Expecto。示例将在 Expecto 中,但问题并非特定于框架。
使用基于示例的测试编写此类设置和拆卸非常容易。它们采用可预测的参数集,因此我可以在添加事件前后的包装器中运行它们。
let testWithEnv setup cleanup name test =
let testWrap () =
let (api, env) = setup ()
test api
cleanup env
testCase name testWrap
属性测试无法做到这一点。他们有未知数量的参数,其中大部分将填充随机数据。
我可以很容易地应用这组成对的行为,但任何创建的资源(如流)都不会被处置。
let testPropertyWithEnv setup cleanup name test =
let testWrap () =
let (api, env) = setup () // this is actually run once, but immutable so the individual runs don't leak state
test api // have to return this to pass along unapplied parameters
testProperty name testWrap
查看how to run FsCheck tests最近的钩子(Hook)似乎是
OnStartFixture
每个测试类只运行一次OnArguments
在每次通过后运行,并可能用于运行清理还有实验Model-based testing features那可以工作。但是,考虑到我只关心操作的外部一致性,这似乎真的很重。我不想访问支持状态。
放弃和内联我总能写
testProperty "name" (fun arg1 arg2 ->
let (api,env) = setup ()
//test code here
cleanup env
)
但我想避免每个属性中的样板文件和支持状态的暴露。
IDisposables一次性对象也没有解决缺少设置 Hook 的问题。
更多实际运行循环我研究了在我的包装器中运行属性测试的方法,但最小的运行器 Check.one
是针对单个属性的,在属性运行之间没有 Hook 。
使包装器变得懒惰也不起作用 testProperty name lazy(testWithSetup)
最佳答案
FsCheck 中实际上没有任何可以帮助您的东西,即使有,我也不认为它会直接暴露在 Expecto 中。我也不认为在 FsCheck 方面添加是那么简单 - 如果您在 FsCheck 存储库中提出问题,我很乐意进一步讨论。
无论如何,通过巧妙地使用部分应用程序并以一些轻微的样板为代价,实际上可以包装“可变参数”函数,我认为这本质上就是您要问的。
看,代码:
// these types are here to make the signatures look nicer
type Api = Api
type Env = Env
let testProperty k =
// call the property with "random" arguments
for i in 0..2 do
k i (char i) (string i)
let setup() =
printfn "setup ran"
(Api, Env)
let teardown Env =
printfn "teardown ran"
let test0 Api arg1 =
printfn "test0 %A" arg1
let test1 Api (arg1:int) (arg2:char) =
printfn "test1 %A %A" arg1 arg2
let test2 Api arg1 arg2 arg3 =
printfn "testFun %A %A %A" arg1 arg2 arg3
let testWithEnv (setup:unit -> Api*Env) (teardown: Env -> unit) (test: Api -> 'a) (k: 'a -> unit) :unit =
let (api, env) = setup()
k (test api)
teardown env
let (<*>) (f,k) arg =
f, (fun c -> k c arg)
let (<!>) f arg =
f, (fun k -> k arg)
let run (f, k) = f k
testProperty (fun arg1 arg2 arg3 ->
testWithEnv setup teardown test2 <!> arg1 <*> arg2 <*> arg3 |> run
)
这里的想法是您使用运算符 <!>
和 <*>
将任意数量的任意类型的参数串在一起,将其传递给 testWithEnv
函数然后调用run
在结果上。运算符和 run
基本上是建立然后应用可变参数列表所必需的。
它都是类型安全的,即如果您忘记传递一个参数或者它的类型错误,您将得到一个类型错误,尽管它可能不像正常的函数应用那样清晰。
我建议将其粘贴到 IDE 中并检查类型,这将极大地帮助理解正在发生的事情。
您可以使用其他几种样式来编写此代码。例如定义略有不同,并且是 the
函数你可以写类似的东西
let (<+>) k arg =
fun c -> k c arg
let the arg =
fun k -> k arg
testWithEnv setup teardown test2 (the arg1 <+> arg2 <+> arg3)
这取代了 run
函数 the
只需要一名运算符(operator) <+>
.可能还有其他方法可以削减它,选择你的毒药。
关于f# - FsCheck 设置和拆卸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65401727/
我正在测试一个类,有很多测试方法。但是,每种方法都有一个独特的上下文。然后我编写如下代码: class TestSomeClass(unittest.TestCase): def test_a
我有一些机器人测试用例在目录中分开。目录层次结构是: ParentTestDirectory |__ ChidTestDirectoryOne |__ TestOne.robo
是否有在测试场景开始/结束时触发的函数? setUp 和 tearDown 函数在每次测试之前/之后触发。 我通常想要这个: class TestSequenceFunctions(unittest.
我有一个商店,里面有元素。每个项目要么是一个组件(它是原子的),要么是由各种组件(但绝不是 2 个或更多相同组件)组成的产品。 现在,当我想从商店取货时,有多种情况: 商店包含必要数量的产品。 商店包
在我的 Selenium 框架中使用 TestNG 时,setUp 方法相对复杂。它可能会破坏多个点,我想将其拆分为单独的步骤。 理想情况下它看起来像这样: // Does some DB stuff
有人以前见过这个并且知道它的含义吗? 14:13:43 PhantomJS 1.9.8 (Linux) ERROR 14:13:43 Error: Cannot have setup/teardo
是否可以以编程方式创建/拆除 Spring 集成 channel ,而不是在 Spring 配置中静态声明它们? 我的情况是这样的: 我有一个需要推送通知的 web 应用程序,所以我使用了长轮询。那些
setUp 和 teardown(前置条件和后置条件设置)是否由名称 setUp() 和 teardown()< 标识 或 @Before 和 @After? 换句话说,在 JUnit 中是否可以有一
我目前正在重构代码,让原始指针使用智能指针,同时也在测试这个类,但遇到智能指针被过早删除的问题 这是一个例子: class SomeObjectType { public: void init(
使用 Apple 的 EADemo 作为基础,我试图了解背景对 EAAccessories 的影响。 当我收到 connectNotification 时,我会获取附件、检查协议(protocol)并
所以,我知道 gtest 有“字面上”的固定装置,但是构造函数/析构函数和设置/拆卸函数将在每个测试之后而不是在整个测试集之后执行夹具。 我能想到解决这个问题的方法,但是是否有一些我没有找到的内置支持
这个问题是关于单元测试框架的xUnit.net . 我需要在执行任何测试之前运行一些代码,并在所有测试完成后运行一些代码。我认为应该有某种属性或标记接口(interface)来指示全局初始化和终止代码
问题 我设置了一个简单的测试,比如 import pytest import pathlib @pytest.fixture def some_resource(): testdir = pa
我有一堆端到端的仪器测试(依赖于 Espresso)启动我们的启动器 Activity ,然后在我们的应用程序中导航(最终创建几个 Activity )。在每个 测试结束时,我们的@After 注释拆
我在 test_helper 中有以下代码 require "minitest/spec" require "minitest/autorun" require "database_cleaner"
我们的 pytest 环境有很多固定装置(主要是 scope='function' 和 scope='module'),它们正在执行以下形式的操作: @pytest.yield_fixture(sco
Pytest has 设置和拆卸 模块、类、方法的 Hook 。 我想在设置中(在测试 session 开始之前)创建我的自定义测试环境,并在所有测试完成后进行清理。换句话说,我如何使用像 setup
我正在尝试使用dbunit来测试系统的数据库。由于可以使用相同的数据集测试多个测试用例,因此我想为所有测试用例初始化一次数据集。但我也使用spring的@AutoWire来初始化那些数据库连接参数。
我有不同的测试文件夹(包)。我想为特定包(文件夹)设置和拆卸一些数据。 问题是 set_up() 在运行该文件夹的测试用例之前执行,但在运行所有测试用例之后,tear_down 没有执行。它也在运行其
我正在使用 Specs2 和使用 Scala 2.10.2(运行 Java 1.7.0_51)构建的 play 2.2.1。我一直在阅读有关如何使用 Specs2 进行设置/拆卸的信息。我已经看到使用
我是一名优秀的程序员,十分优秀!