With more than 25 years in software development, Thomas is an independent consultant based in
Stockholm, Sweden.
He has a Masters degree in Computer Science from the Royal Institute of Technology (KTH), Sweden's
leading technical university. After graduation, Thomas also taught at KTH.
Thomas currently teaches Behaviour-Driven Development, BDD, with Aslak Hellesøy, the creator of
Cucumber. Thomas has commit privileges on the open-source Cucumber project, and works in partnership
with Cucumber Ltd. as well as Mozaic Works.
As a consultant, trainer, and developer Thomas has created value for many teams around Europe. For the
last ten years, Thomas has been an invited conference speaker at GeeCON,
I T.A.K.E. Unconference, and European Testing Conference on topics including software craftsmanship,
clean code, test automation, and continuous deployment.
His blog at thinkcode.se/blog shares his obsessions with technical excellence,
Test-Driven Development, TDD, and BDD.
Thomas tweets as @thomassundberg
Posts by Thomas
- TDD with an AI assistant, my perspective as a beginning practitioner — 2026-02-16
- Compare time with AssertJ — 2020-04-30
- Context switching in git — 2020-03-11
- Delegating writing unit tests — 2020-02-27
- Setting execution permission from git — 2020-01-31
- Jenkins configuration as code — 2019-12-23
- Two Jenkins jobs - one Jenkinsfile — 2019-11-26
- Test-Driven development is hard — 2019-10-31
- What is the size of a baby step? — 2019-05-18
- What is BDD? — 2019-04-24
- How to implement a Cucumber-JVM plugin — 2019-03-07
- Kubernetes service node port range — 2019-02-20
- A Jersey client supporting https — 2019-01-27
- Data tables in Cucumber 3 — 2018-06-30
- I T.A.K.E. Unconference 2018 — 2018-05-20
- What does BDD really stand for? — 2018-04-17
- Testing stage 2018 — 2018-03-26
- Getting started with Cucumber for JavaScript — 2018-02-07
- Languages supported by Cucumber-JVM — 2018-01-24
- Finding the Unknown Unknown — 2017-12-20
- Cucumber - tagging scenarios — 2017-10-26
- Test automation and Selenium: 4 rules for keeping your tests simple — 2017-09-28
- Sharing state between steps in Cucumber-JVM using Guice — 2017-08-16
- Gradle: setTestClassesDir(File) method has been deprecated — 2017-08-14
- Use the same language — 2017-07-25
- Sharing state between steps in Cucumber-JVM using Spring — 2017-06-24
- Gherkin scenarios - some good properties — 2017-05-29
- Organising scenarios and steps in Cucumber — 2017-04-28
- Sharing state between steps in Cucumber-JVM using PicoContainer — 2017-04-01
- Zero-downtime deployment with HAProxy as load balancer — 2017-03-29
- How do you create a good specification? — 2017-02-26
- What is the difference between a specification and a good specification? — 2017-01-30
- Cucumber and Gherkin are not about flexibility — 2016-12-04
- Creating confidence when testing — 2016-10-03
- Why should you care about quality? — 2016-09-01
- Creating technical debt is like gaining weight — 2016-08-06
- Gatling - a tool for load testing — 2016-08-04
- The Right Tool for the Job — 2016-07-25
- Cucumber Anti-Patterns — 2016-06-22
- Hamcrest, JUnit, Mockito, IntelliJ IDEA, Gradle, and java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch — 2016-04-18
- Cucumber regular expression cheat sheet — 2016-04-02
- Where should you use Behaviour Driven Development, BDD? — 2016-03-26
- Dependencies between tests — 2016-03-25
- Comments are deodorant for your code — 2016-02-16
- Separation of concern when using Selenium — 2016-01-14
- Gradle and Cucumber-JVM — 2015-12-26
- Continuous deployment - a case study — 2015-12-23
- Expected exceptions — 2015-11-20
- Different asserts are good in different situations — 2015-11-06
- When is evolutionary design a good way to implement software? — 2015-10-27
- Conference do’s and don’ts — 2015-09-15
- RPM Cheat sheet — 2015-09-10
- YUM Cheat sheet — 2015-09-10
- Increase the available disk on a CentOS host maintained by Vagrant and VirtualBox — 2015-09-10
- Packaging a zip file from Java using Apache Commons compress — 2015-08-21
- Tell, don’t ask — 2015-07-17
- Include header and footer in a Mustache template — 2015-06-19
- Separating acceptance tests — 2015-04-29
- Stubbing a var arg method using Mockito — 2015-04-28
- A Gradle plugin written in Java — 2015-03-22
- Gall's law — 2015-02-28
- When is it automated? — 2015-02-28
- Which artifacts do you want when you build a system? — 2015-02-16
- BDD with Cucumber-JVM at GeeCON TDD 2015 — 2015-01-30
- How do you recruit a good developer? — 2014-12-31
- Hard code first — 2014-11-30
- Removing the auto generated class header in IntelliJ IDEA — 2014-10-24
- An email marketing system built using test first and Cucumber-JVM — 2014-10-23
- Making life easier with a multi module Maven project — 2014-09-20
- Run SSH from Java — 2014-08-27
- Cucumber-JVM Hello world with Gradle — 2014-08-24
- Comparing Maven and Gradle — 2014-07-02
- Cucumber data tables — 2014-06-30
- Cucumber-JVM Hello world — 2014-05-29
- Use Maven build directory in your plugin — 2014-05-21
- Passing non primitive objects as parameters to a unit test — 2014-04-24
- Why Cucumber? — 2014-03-30
- Scripting with Ruby and Maven — 2014-02-28
- Test automation — 2014-01-28
- Parametrised unit tests — 2013-12-28
- Resources — 2013-11-30
- System Under Specification, SUS — 2013-10-15
- How is a hero created? — 2013-09-30
- Is the parameter used? — 2013-07-31
- Hero culture and curling — 2013-06-30
- Change the binary path for a Windows service — 2013-05-16
- Teaching - the difference between a lecture and a conversation — 2013-04-02
- Embrace change or embrace uncertainty — 2013-03-02
- Maven - the simplest possible introduction? — 2013-02-24
- Take control of your time — 2013-01-31
- Test coverage - friend or foe? — 2012-12-18
- Cucumber-JVM - not just for testing GUIs — 2012-11-01
- Building the model — 2012-11-01
- A JSF web application — 2012-11-01
- A Wicket web application — 2012-11-01
- Building a Swing GUI — 2012-11-01
- A RESTFul Web Service — 2012-11-01
- A SOAP Web Service — 2012-11-01
- Conclusion — 2012-11-01
- Selenium WebDriver - the simplest possible start? — 2012-10-29
- All computer systems are equal — 2012-10-13
- JBoss Drools - a hello world example — 2012-10-11
- Test drive an implementation using an Executable Specification - revisited — 2012-09-28
- Want change and is willing to change — 2012-09-19
- Want change but don’t want to change — 2012-09-03
- Separating tests in Maven — 2012-08-21
- Performing an action when a test fails — 2012-07-08
- Pair Programing — 2012-06-15
- Adding a JUnit test template in IntelliJ IDEA — 2012-06-01
- Using Hibernate Second level cache in JBoss 5.1 — 2012-05-10
- Execute tests in random order — 2012-05-03
- Challenging requirements — 2012-04-02
- What is a good test? — 2012-03-08
- Test coverage in a multi module Maven project — 2012-02-18
- Missing ant-jsch.jar — 2012-01-16
- ssh from Ant — 2012-01-16
- How many train wrecks are lurking in your code? — 2011-12-30
- Testing a Web Service with SoapUI, JUnit, Maven and Cucumber — 2011-11-16
- The simplest possible solution — 2011-11-16
- Why separate test definitions from a driving JUnit class? — 2011-10-31
- Testing a web application with Selenium 2 — 2011-10-18
- Maven Java heap space — 2011-10-14
- Why isn’t my tests being executed? — 2011-10-06
- Test drive an implementation using an Executable Specification — 2011-09-16
- Test drive the implementation of a database layer — 2011-08-07
- What is the difference between i++ and ++i? — 2011-08-05
- Magic numbers — 2011-07-28
- Do not return null — 2011-07-28
- Install a 3:rd part lib in Maven — 2011-06-10
- A Generics example — 2011-05-22
- FEST Assert - a fluent interface for assertions — 2011-04-24
- Software craftsmanship and raising the bar — 2011-04-20
- Why should you use different technical practises when you develop software? — 2011-04-14
- Four rules of simple design — 2011-04-06
- What is you passion? — 2011-03-28
- Set working directory for your Jenkins continuous build server — 2011-03-07
- Create an executable jar from Maven — 2011-03-05
- Build is platform dependent — 2011-02-22
- Unmappable character for encoding UTF-8 — 2011-02-17
- Stating the obvious — 2011-02-14
- Maven and Antrun — 2011-02-11
- Failing Maven builds in Hudson — 2011-01-21
- Automatically integration test an ejb with Maven — 2010-12-21
- Parameterized JUnits tests — 2010-07-11
- Maven and JBoss ESB - Hello World — 2010-07-09
- Dependency injection — 2010-05-16
- How to convert a POJO to XML with JAXB — 2010-01-19
- HttpComponents - a great tool with great examples based on a future release — 2009-08-04
- Getting started with Continuous Integration — 2009-04-22
- Integration test a web application with Selenium — 2009-04-17
- Hibernate, Spring and Maven — 2009-04-09
- How can I create a simple web application using Spring MVC? — 2009-04-06