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
- AI Coding Assistant: More Observations from a Practitioner | 2026-03-17
- Boring tech is good tech | 2026-03-11
- Testing a web application with Playwright | 2026-03-01
- Why I still blog in 2026 | 2026-02-25
- 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