Welcome!

@DevOpsSummit Authors: Yeshim Deniz, Stefana Muller, Elizabeth White, Liz McMillan, Pat Romanski

Related Topics: @DevOpsSummit, Microservices Expo, @CloudExpo

@DevOpsSummit: Article

Test-Driven Development | @CloudExpo #DevOps #APM #Microservices

What Does Test-Driven Development Mean for Performance Testers?

What Does Test-Driven Development Mean for Performance Testers?

"Begin with the end in mind."

You must have heard that phrase, right? It's a common one that's led many people to great success, not just in agile, but all throughout history. In fact, it's habit #2 in Stephen Covey's best-selling book The 7 Habits of Highly Effective People.

Starting with the end in mind is what Olympic athletes do when they visualize their gold medals. Musicians do it when they envision their perfect performance before stepping on stage. Architects have a full picture of the completed skyscraper in their head before ground is broken. If you know what you are aiming for, in detail, you'll find it much easier to achieve.

That's exactly the philosophy behind Test-Driven Development, or TDD. Before you start coding business logic, you write a test. It's almost like a detailed specification for the module you are creating, except it's produced as a set of functions and gates that the module will have to pass through to confirm it is working as expected. When you initially run the test, it'll naturally fail because your code doesn't yet do anything. However, once the test passes, you know you've built what you needed to build.

TDD is there to make sure you don't overbuild. You control costs, you increase efficiency, and you build quality into the product from the beginning. You only create what's needed to pass the test - no more, no less. You eliminate all that wasteful junk that ends up never getting used (or at least a lot of it). For most people, TDD is a great way to ensure that your app delivers on the functionality it needs to.

Can TDD Apply To Performance?

Test-Driven Development is a great tool for functional testing, but can you apply the same technique to performance testing?

Why not?

The purpose of TDD is to build out small unit tests, or scenarios, under which you control your initial coding. Your tests will fail the first time you run them because you haven't actually developed any code. But once you do start coding, you'll end up with just enough code to pass the test.

There's no reason the same philosophy can't be applied to performance testing. You can develop performance tests that stress algorithms and exercise code at the unit-level, just like functional tests do. Unit performance tests give you a baseline confidence in your core algorithms. They force developers to think about how their code behaves under stress at the time that code is being written.

Just like with functional testing, TDD helps to eliminate big, systemic problems that may appear later on. The process just requires the forethought involved in careful scenario planning.

Performance TDD Is a Good Start, But It's Not Everything

Let's face it: even if your app passed all its TDD-based unit tests for functional testing, you still wouldn't feel confident that it was flawless. No matter what you were doing for TDD, you'd still create larger functional tests, integration tests, end-user tests, and a whole host of other tests. You'd have a suite of different functional test methods you'd bring to bear to make sure your app was ready for users to attack it.

The same thing is true for load & performance testing. Just because you incorporate Performance Test-Driven Development, doesn't mean all your performance issues are solved. You'll still need to coordinate your large, integrated load tests to push your algorithms to their breaking points.

But with Performance TDD, you'll have much more confidence in your product's ability to pass those tests at the get-go.

Some Tricks for Performance TDD

If you want to incorporate Performance TDD into your development process, here are a few tips that may come in handy:

  1. Create small-batch load tests that can stress small components. As you start planning your module, think about how that module would be stressed. What algorithms are most likely to limit scalability? Is there an opportunity for resource contention? Do you have queries that could impact performance if they get too large or complicated? Then create your test scenarios specifically to stress the component in these ways. As you and your team work through more and more of the product, you'll end up building an amazing library of load test scenarios that you can leverage in lots of interesting ways moving forward.
  2. Don't apply TDD to optimizations, instead just use it for base-level performance. The job of a performance engineer is often focused on optimizing code that's already been written by someone. TDD isn't really going to be much help here. Remember, TDD is best leveraged at the beginning of the code-writing process. So that's where you should start. As your product matures, it's completely appropriate to make your load tests incrementally more demanding (a certain function must return in 2 seconds instead of 4 seconds), but that may not always be the ideal place to focus because scaling problems are often driven by more complex interactions that are best suited for different kinds of test methodologies.
  3. Automate. TDD and automation go hand-in-hand, and you should approach it that way from the beginning. Think about how to automate your TDD from the moment you start doing it, like any modern development method. By doing this, you'll be able to easily plug your performance testing into other automated processes like continuous integration, but you'll also end up with a number of micro-load test scenarios that can be strung together into a larger automated test scenario. This gives you a ton of leverage.

Conclusion

As we've said before, the more you can plug performance testing into your standard development process, the more effective you'll be as a team, and the more successful your application will become. If your team operates using Functional TDD, you'll definitely find value enhancing that practice with Performance TDD.

Photo Credit: Andrew Hurley

More Stories By Tim Hinds

Tim Hinds is the Product Marketing Manager for NeoLoad at Neotys. He has a background in Agile software development, Scrum, Kanban, Continuous Integration, Continuous Delivery, and Continuous Testing practices.

Previously, Tim was Product Marketing Manager at AccuRev, a company acquired by Micro Focus, where he worked with software configuration management, issue tracking, Agile project management, continuous integration, workflow automation, and distributed version control systems.

@DevOpsSummit Stories
Nicolas Fierro is CEO of MIMIR Blockchain Solutions. He is a programmer, technologist, and operations dev who has worked with Ethereum and blockchain since 2014. His knowledge in blockchain dates to when he performed dev ops services to the Ethereum Foundation as one the privileged few developers to work with the original core team in Switzerland.
Traditional IT, great for stable systems of record, is struggling to cope with newer, agile systems of engagement requirements coming straight from the business. In his session at 18th Cloud Expo, William Morrish, General Manager of Product Sales at Interoute, will outline ways of exploiting new architectures to enable both systems and building them to support your existing platforms, with an eye for the future. Technologies such as Docker and the hyper-convergence of computing, networking and storage creates a platform for consolidation, migration and enabling digital transformation.
As Cybric's Chief Technology Officer, Mike D. Kail is responsible for the strategic vision and technical direction of the platform. Prior to founding Cybric, Mike was Yahoo's CIO and SVP of Infrastructure, where he led the IT and Data Center functions for the company. He has more than 24 years of IT Operations experience with a focus on highly-scalable architectures.
An edge gateway is an essential piece of infrastructure for large scale cloud-based services. In his session at 17th Cloud Expo, Mikey Cohen, Manager, Edge Gateway at Netflix, detailed the purpose, benefits and use cases for an edge gateway to provide security, traffic management and cloud cross region resiliency. He discussed how a gateway can be used to enhance continuous deployment and help testing of new service versions and get service insights and more. Philosophical and architectural approaches to what belongs in a gateway vs what should be in services were also discussed. Real examples of how gateway services are used in front of nearly all of Netflix's consumer facing traffic showed how gateway infrastructure is used in real highly available, massive scale services.
Enterprises have taken advantage of IoT to achieve important revenue and cost advantages. What is less apparent is how incumbent enterprises operating at scale have, following success with IoT, built analytic, operations management and software development capabilities - ranging from autonomous vehicles to manageable robotics installations. They have embraced these capabilities as if they were Silicon Valley startups.