Your Convey needs more Focus

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...

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
The Meet to Learn
Arrow Icon
Interpersonal skills and how they tie to leadership, teamwork, and business growth is no cakewalk. Yet every business knows that retention of employees is largely contingent upon quality interpersonal skills. That's why so many organizations implement principles and techniques taught by the greats. I'm sure you've heard of Dale Carnegie's "How to Win Friends & Influence People", Steven R. Covey's "The 7 Habits of Highly Effective People", or maybe even "Dare to Lead" by Dr. Brene Brown.
Address Autocomplete Best Practices
Arrow Icon
Properly implemented address autocomplete can help businesses to improve conversion rates by speeding up address entry, improve address data quality by reducing typos, and reduce user frustration related to errant address data.  But, if you choose the wrong autocomplete API or make implementation errors, those benefits can evaporate. In our new ebook, "Magical Benefits of Address Autocomplete," where we've compiled valuable insights and implementation tips, including the best practices we'll cover here.
Inside Smarty - Andrew Townsend
Arrow Icon
It's often said you need two skills to find love: sales and marketing.  You need marketing skills to present yourself well and gain the attention of the person you want. Then, you need sales skills to lie like you're the devil himself.  But what if you aren't conventionally attractive and (like the sales team at Smarty) aren't willing to lie? To compensate, you'll need to dial up your marketing; we're talkin' data automation, streamlined & integrated data systems, time-saving and cost management, eliminating human error, and workflows like crazy.

The leader in location data intelligence

Ready to get started?