Your Convey needs more Focus
One of the great benefits of TDD/BDD is that you usually don't have to spend much, if any time at all in a debugger. To enter a debugger is to admit a loss of control over the system under test. Even so, there are times when you do need to debug something, even if you're maintaining the discipline.
Lately, most of my coding is in GoLang. Coming from using an IDE almost exclusively to write Python (using PyCharm) and C# (using VS and ReSharper), and knowing how great the visual debugging tools are it's hard to fathom using a console-based debugger for GoLang code. Yes, I know about godbg, which is an amazing tool, but I would rather stay in my test runner of choice, which is GoConvey.
Up until now I would do something like this to achieve debugging:
- Add
log.Println
statements where the bugs are - Use
SkipConvey
to limit execution to the test in question (this can get tedious if the test suite is large) - Run the tests and observe the output
Or...
- Add the logging statements
- Use an
init
function in the test code to substitute a nil writer to the logger - Substitute
stdout
in theConvey
scope that executes the code with logging - run the tests and observe the output
Yuck.
Now, there's a better way. It still means putting in some logging, which may or may not be temporary. But, all you have to do now is something like this:
FocusConvey("Subject: Integer incrementation and decrementation", t, func() {
var x int
FocusConvey("Given a starting integer value", func() {
x = 42
FocusConvey("When incremented", func() {
x++
Convey("The value should be greater by one", func() {
So(x, ShouldEqual, 43)
})
FocusConvey("The value should NOT be what it used to be", func() {
So(x, ShouldNotEqual, 42)
})
})
Convey("When decremented", func() {
x--
Convey("The value should be lesser by one", func() {
So(x, ShouldEqual, 41)
})
Convey("The value should NOT be what it used to be", func() {
So(x, ShouldNotEqual, 42)
})
})
Reset(func() {
x = 0
})
})
})
In this code, only those scopes declared with FocusConvey
will be executed, the reset will be ignored. Much easier to toggle for debugging purposes.
Of course, you shouldn't leave the test suite with a bunch of FocusConvey
calls lying around. After you fix your code get rid of the Focus
and just keep Convey
.
Happy debugging!