Why did ‘should’ become the going nomenclature of BDD framworks?
‘Should’ connotes ‘ought’, as if something ought to do xyz, but
doesn’t necessarily have to. I don’t know about you, but I don’t write
my tests/specs that way!
‘Must’ is the word that denotes what our tests/specs do.
my_method.must.do_the_right_thing
not
my_method.should.do_the_right_thing
‘Must’ is a shorter word too. So why didn’t it become the word of
choice here?
I think long dead Grammar teachers are rolling in their graves.
Why did ‘should’ become the going nomenclature of BDD framworks?
‘Should’ connotes ‘ought’, as if something ought to do xyz, but
doesn’t necessarily have to. I don’t know about you, but I don’t write
my tests/specs that way!
‘Must’ is the word that denotes what our tests/specs do.
I agree. I’ve suggested the classic requirement-docs’ “shall” in the
past too, but “must” has an immediacy more appropriate to BDD.
my_method.must.do_the_right_thing.
it didn’t? but it must!
my_method.should.do_the_right_thing.
it didn’t, but it should!
For me the second example feels more natural in a environment where
you expect tests to fail at first, maybe this is different in BDD than
in TDD, I don’t know enough about BDD. Especially when you use tests
to design interfaces the “should” thinking comes more natural: You
don’t have a feature yet but you write down what it should do, then
you implement it.
On 18.11.2008, at 13:30 , Charles Oliver N. wrote:
On Nov 18, 2008, at 8:46 AM, Einar Magnús Boson wrote:
than in TDD, I don’t know enough about BDD. Especially when you use
tests to design interfaces the “should” thinking comes more natural:
You don’t have a feature yet but you write down what it should do,
then you implement it.
Announcing yet another test framework: Musty!
Its perfect for dusting off that old, untested code and bringing it
into the modern era! Since its already in production, it MUST be doing
the right thing already, right?
i’m with you dan - the fact that ‘should’ somehow produces better code
that ‘assert’ is plain crazy. so is changing a T(DD) to a B.
I think Shoulda can create a printable, formatable spec from the tests
themselves that PM’s can easily read. Or is that RSpec? Or do either
of them have that feature? I thought one of them did.
That’s about the only practical advantage I can see. And, I think
that’s something that could be integrated into Test::Unit if we really
wanted it.
I think Shoulda can create a printable, formatable spec from the tests
themselves that PM’s can easily read. Or is that RSpec? Or do either
of them have that feature? I thought one of them did.
you mean as opposed to reading the actual spec right? (aka the code)
Who are these PM’s who can read code?
sorry - couldn’t resist.
No problem.
Hm, random idea here…if specs were formalized somehow…then we could
autogenerate a test spec from the written spec and vice-versa. A bridge
between
PM’s and programmers. Something like UML, but for tests…
I dunno…just a thought. Maybe it already exists?
That’s about the only practical advantage I can see. And, I think
that’s something that could be integrated into Test::Unit if we really
wanted it.
indeedy. and change T to B while you’re at it. much more efficient and
speedy.
Speaking of efficiency and speed I highly recommend people upgrade to
Test::Unit
2.x. The startup and shutdown methods alone are worth it, as they could
save
many, many calls that you would otherwise shove in a setup method.
I think Shoulda can create a printable, formatable spec from the tests
themselves that PM’s can easily read. Or is that RSpec? Or do either
of them have that feature? I thought one of them did.
you mean as opposed to reading the actual spec right? (aka the
code)
sorry - couldn’t resist.
That’s about the only practical advantage I can see. And, I think
that’s something that could be integrated into Test::Unit if we really
wanted it.
indeedy. and change T to B while you’re at it. much more efficient
and speedy.
Hm, random idea here…if specs were formalized somehow…then we could
autogenerate a test spec from the written spec and vice-versa. A bridge
between PM’s and programmers. Something like UML, but for tests…
I dunno…just a thought. Maybe it already exists?
It’s called FIT[1], or, in the Ruby world, Cucumber[2] (successor to
the RSpec Story Runner).
Why did ‘should’ become the going nomenclature of BDD framworks?
Because that’s the word PMs and clients typically use when they are
describing a system, and BDD attempts to eliminate vocabulary
differences between the client and the programmer.
True, they sometimes say “must”, when they really want to emphasize
something. But for the most part they say things like “after the user
logs in they should be shown a list of overdue frobbits, if there are
any”.
do just fine.
nullifies or somehow challenges a previous requirement.
Thanks. This thread has been even more fruitful than I expected. I
truly understand why “should” has been used. Not to say “must” and
others are wrong, of course, but I see how the perspective of
anticipation of code-to-be lends to the use of word “should”. It
occurs to me that “expect” is also a good word form this perspective;
and interestingly we see that term being used in both TDD and BDD.
Something else I noticed. Originally I wanted reuse the word “assert”
–I like the word. So instead of ‘should’ I defined a helper to do:
e.assert == r
Now, with this new perspective, I figure I’d go ahead and use #should.
When I went to convert it however it didn’t quite come out as I
expected, because I had put the expectation first and the actualized
result last. Ie.
expected.should == result
While this is OK, it doesn’t quite translate. It reads much better:
result.should == expected
That’s how we talk about these things.
But then it hits me, trying to make this read well has led to a
potential issue. In Ruby equality is tested by the receiver. If we
make result the receiver then it is the one deciding if it is equal to
the expected. But a robust implementation would have the expected
decide.
I realize this is small minutia to the overall issues involved, but I
thought it was an interesting point nonetheless. It would seem, the
way in which we speak and think about things cannot necessarily be
reflected in the way we write our code.