Your Convey needs more FocusOne 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...
February 7, 2014

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


  • Add the logging statements
  • Use an init function in the test code to substitute a nil writer to the logger
  • Substitute stdout in the Convey scope that executes the code with logging
  • run the tests and observe the output


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() {

			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() {

			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!

Subscribe to our blog!
Learn more about RSS feeds here.
rss feed iconSubscribe Now
Read our recent posts
World Juggling Day: Tips from Smarty’s jester
Arrow Icon
It’s that time of year when we toss aside our fears and woes and throw our hands up in celebration; World Juggling Day is here. Whether you toss hacky sacs, bowling pins, flaming torches, or your cookies, juggling has been a long-standing form of fun, fitness, and flair. Let’s talk about this quirky holiday. History of jugglingThe history of juggling is rich and dates back almost 4,000 years. In ancient Egyptian times, tombs shared depictions of juggling. Greeks and Romans also tossed their hats into the juggling arena, yet juggling began to be scorned and overlooked by many in the Middle Ages due to claims that jugglers dealt with immorality and witchcraft.
Wizardry - How Smarty makes professional improvement magical, and you can, too
Arrow Icon
Alright, gather 'round, fellow wizards and witches! It's time to unveil the secrets to mastering the mystical art of professional development at Smarty. Yes, “wizardry” typically refers to wearing cloaks, wielding wands, riding broomsticks, and mixing potions. At Smarty, we think of “wizardry” as being the best at doing what we do. We’re going above and beyond to not only become experts in our field but also stay that way through shifts in technology and culture. However, being the best shouldn’t be an afterthought; at Smarty, it’s not.
Authentic culture: Exploring the depths with Smarty
Arrow Icon
Navigating the depths of corporate cultureIn today's business world, many companies create a surface-level culture within their company structures but stop there, never seeming to invest fully in deepening a healthy culture. Surface-level culture can be visually appealing and immediately gratifying. Imagine, for example, a delicious cake. It’s beautifully decorated but tastes off or is missing an ingredient that spoils the final product. An intentional and deep culture is hard work. It takes time, action, correction, and honest feedback from everyone in the company.