通常在 RSpec/Cucumber 中进行功能测试时,我想模拟一系列相关的程序用户操作。例如,用户可能会登录,然后更新个人资料,然后在站点上执行一些其他操作,然后注销,等等...
在 RSpec 中,类似的功能测试可能看起来像这样:
describe "Step 1: Sign in" do
before do
# Capybara logic
end
describe "Step 2: Visit settings page" do
before do
end
describe "Step 3: Update profile" do
before do
# More Capybara/etc...
end
describe "Step 4: Making a new post" do
before do
# ......
end
describe "Step 5: Viewing inbox" do
before do
# ...
# More nested code etc, etc, etc...
end
end
end
end
end
end
但是,显然这种嵌套很快就会失去控制,尤其是在测试网站上的复杂行为时。此外,最外层嵌套中的“之前” block 比内部 before
block 运行更多次,从而不必要地减慢测试套件。
那么,是否有更优雅的方法来处理这个问题?我可以使用 shared_examples_for
、it_behaves_like
、shared_context
、before(:all)
、辅助方法等。但是当我只想按程序运行测试而不需要每个测试都运行时,这似乎很尴尬隔离运行。换句话说,我正在寻找这样的测试 DSL:
# Step 1:
test "Sign in" do
visit "/sign_in"
fill_in "whatever"
# ...
end
# Step 2:
test "Update profile", after: "Sign in" do
# Runs after "Sign in" sharing same context so variables and object states aren't reset
end
是的,我知道原则上测试是独立运行的,但公平地说,当测试中的每个步骤都可能依赖于先前测试的结果时,这样做并不总是可行的。
按要求分组时,规范非常有效。它会针对每种情况进行设置/拆卸,并在您知道情况是什么但不知道功能是什么时使它们易于扫描。
例如:
describe "a logged in user" do
before do
# log in
end
describe "with 3 items" do
before do
# add 3 items
end
it "displays 3 items in the cart" do
end
end
describe "with 0 items" do
it "displays an empty cart" do
end
end
end
我认为嵌套规范不能很好地描述实现(例如,先做这个,再做那个)。这似乎很快就爆发了
我是一名优秀的程序员,十分优秀!