Andrzej Krzywda

Fishbowl Discussion: Testing

This video was recorded on http://wrocloverb.com. You should follow us at https://twitter.com/wrocloverb. See you next year!

All you wanted to question about testing but was afraid to flame. In this heated debate where everyone could participate we focused on the following discussion starters: cucumber vs. object oriented tests, tdd vs. bdd, full-stack vs. frontend/backend testing, steak vs. bbq, rspec vs. minitest or just no-tests drama.

Discussion has been conducted under rules of a Fishbowl http://en.wikipedia.org/wiki/Fishbowl_(conversation)

wroc_love.rb 2012

00:00:12 We have four people here who will be starting the discussion about testing and its various aspects. As you can see, there's one free seat, so at any moment, if you would like to contribute to the discussion, please come down and take a seat. One of the people here will have to leave, or I might have to ask them to do so. You are very welcome to join in on the discussion.
00:00:45 As a warm-up, we'll start with a very popular topic: Test-Driven Development (TDD). I would like to know your thoughts on TDD in general.
00:01:11 TDD is very handy to show, and it provides quick feedback loops. It's a great way to guide your code design. It not only ensures that you are doing the right thing but also helps you with the design aspects of your work. Personally, I used to be a strong believer in GDD (Goal-Driven Development), but I've become more flexible over time, realizing that other approaches can work as well.
00:01:40 It's very much an individual choice; some people work well with TDD, while others do not, and that's perfectly fine. When I have the discipline to do it right, I really enjoy using TDD. However, at times I find myself skipping it for various reasons.
00:02:06 I think that TDD is not a silver bullet and isn't always useful. It has its merits, but I wouldn't start with it in every situation. For example, when working on an API, it can be beneficial because it allows you to structure your design from the ground up. However, I discourage starting with TDD for minor details.
00:02:36 What frustrates me about some introductions to TDD is that they often focus on very small examples, which don't reflect the reality of real projects. In those cases, TDD can consume a lot of time without offering substantial benefits. However, if you use it to develop general code and figure out structures, it's quite beneficial.
00:03:05 Sometimes, TDD can help you design your code effectively. For many years, I practiced TDD without engaging in prototyping or writing tests first. In certain situations, I find that TDD can be a waste of time, as it may hinder creativity. When I have an excellent idea for code and then realize I need to write the tests first, I sometimes think, 'Forget it; I don't have time.'
00:03:31 So essentially, you're saying you don't always execute TDD. Thank you for sharing that perspective. Do you have any additional comments about your experience with TDD?
00:04:11 I think it's crucial to have a good understanding of your technology to effectively use TDD. Knowing the framework and potential problems you might encounter is essential. In my experience, if you lack that knowledge, it can become challenging.
00:04:42 I completely agree. When we aim to design effectively, knowing the possibilities of our technologies is critical. If you're struggling with technology and trying to implement TDD simultaneously, you may get lost in the details, leading to frustration. In your opinion, when is it suitable to use TDD, and when should it be avoided?
00:05:07 That's a tough question. It's a combination of factors. For example, while prototyping, you may not find TDD to be beneficial as it introduces overhead. TDD works best when you're already in the flow, but sometimes initiating it can feel burdensome.
00:05:57 Additionally, whether TDD is suitable really depends on the individual, the team, the project, and their expertise. There's no universal rule for deciding when to apply TDD; it truly depends on the context.
00:06:31 TDD is meant to help you design your code better. If you can visualize the tests you need while coding, you might not necessarily need to write them because you have a clear understanding of your design. Sometimes, I find myself envisioning the design in my head without needing to commit it to tests immediately.
00:07:10 I believe if you're comfortable with your design and feel it's solid, you may not need to rely on TDD at that stage. You can design it based on your understanding, but for improving or refining your design or quality, TDD becomes invaluable.
00:07:27 A new participant joins, expressing that it seems unprofessional not to practice TDD. If you feel it slows you down, they suggest perhaps considering more programming practice rather than defaulting to that assumption.
00:08:09 However, I feel that label of 'unprofessional' can be misleading. Experienced programmers can gauge when to apply various techniques, and there is no technique that suits every project or piece of code. Dismissing effective practices can lead to inefficiency or frustration.
00:08:36 I believe that in projects where TDD is a good fit, its utility becomes evident. However, it's worth noting that saying TDD is universally applicable creates unrealistic expectations and could lead to unnecessary challenges.
00:09:04 When approaching testing, it's not just about putting something together; it's about considering the quality and maintainability of your tests. If you must write tests afterwards, they may become tedious, and TDD might actually be the more engaging approach.
00:09:28 The discussion shifts to contrasting testing types and methodologies. One speaker emphasizes the importance of acceptance testing and how its focus should be on features to validate them rather than disrupting the workflow.
00:09:56 Regarding TDD, one speaker discusses experimentation and how skipping unit tests initially may yield speed but did not foster refined design. The dialogue points towards balancing speed with maintaining quality in code.
00:10:34 Another participant shares experiences with TDD, indicating that choice also plays a role in the adoption and rejection of its practices—sometimes based on the understanding of the discipline and comfort with the methodologies.
00:11:00 People often may struggle with TDD due to a lack of proper guidance or skills, leading to not applying it in their work. It's important to balance maintainability and adaptability of one’s approach based on project needs and contexts.
00:12:00 Continuing the conversation, it becomes evident that developing a clear understanding of design and structure impacts testing protocols. The balance of proficiency in the language and tools also influences effectiveness in implementing TDD.
00:12:27 One programmer explains that writing the tests first can sometimes feel like a hurdle that takes them out of the creative zone. The initial friction often leads to resistance but can be eased over time with practice.
00:12:58 Another perspective follows, highlighting that if programmers take their time and adapt to practices slowly, they can recognize the benefits without feeling overwhelmed. Short-term discomfort can lead to long-term stability.
00:13:26 The conversation transitions to the need for adaptable approaches in writing tests. Finding a rhythm that allows for creativity alongside maintaining robust testing procedures is critical for effective programming.
00:14:00 The discussions shift back towards what shifts effective methodologies; reuse and modification become key points. Establishing tests without tying them too closely to one implementation allows for broader application.
00:14:35 Participants discuss the importance of embracing new tools and approaches in testing environments while emphasizing the maintainability and scalability of tests to meet evolving project needs.
00:15:09 They also touch upon tests that keep the project agile without being cumbersome, stressing that documenting processes early on helps in providing clarity when working with clients.
00:15:51 A participant discusses tools like Cucumber and the struggle with maintaining tests over time, suggesting that a shift towards more object-oriented testing may offer better adaptability. The nuances of writing effective tests become paramount.
00:16:15 Further analysis of acceptance testing philosophies and the implications arise, targeted towards how tests should reflect both functional needs and intuitive design considerations to bridge gaps and avoid common pitfalls.
00:16:39 The potential for a hybrid of testing styles may yield more robust results; however, balancing the technical complexity with client comprehension stands crucial. The importance of effective communication is reiterated.
00:17:01 Establishing paradigms around testing becomes a point of debate, with calls for clearer frameworks highlighting usability over technical numeral accuracy. The diversity of opinion brings out how development practices vary.
00:17:47 Closing the topic on testing methodologies, importance shifts towards adaptability for both programmers and clients alike, leading back to establishing consensus on what constitutes effective testing.
00:18:22 Participants contribute thoughts on alternative testing philosophies, challenging established methods, and how effectively understanding user requirements aids in creating better tests. This fluidity cultivates discussion around design.
00:19:00 As the discussion wraps, the focus turns back towards the professional utility versus efficacy of testing methodologies, with opinions on Cucumber being pivotal in contrasting these perspectives.
00:19:46 The ongoing dynamics ensure that differing views are duly noted, emphasizing that no single method will suffice in all scenarios assuring designs evolve with ongoing inputs.
00:20:23 To conclude, open comments remind everyone of the greater spectrum that exists in testing concepts while prompting further dialogues about effective techniques.
00:21:01 Acknowledgements and final thoughts deliver a more rounded approach to evaluating both testing methodologies and design principles, inviting future explorations as the group disperses.
00:21:44 Final closing remarks hint at the need for continuous learning and evolution in programming practices, reassuring that diverse methodologies hold equal weight in practice.
00:22:18 The session closes with recognition to varying perspectives, urging everyone to engage further with resources that support effective testing—the topics of discussion reflect shared experiences and innovative ideas.
00:22:50 They conclude the discussion, thanking everyone for their participation and hinting at future events to continue the exploration of testing and programming practices together.