We live in an era where we can find anything in an instant. If there's something we want to explore further, discover, and learn deeply about, all we need is to sit in front of an Internet-connected device and do a bit of research. In minutes you'll have more than enough information to get started immediately. When it comes to studying the field of software testing, you have an infinite number of choices to learn anything you want.
You can read up on the latest news or gain a new perspective by reading blogs like this one. Your nearest library or bookstore carries some of the best books about testing ever written. Countless course providers offer classes on any subject that interests you. You can even find complete coverage of testing frameworks and tools for free on YouTube. If you have the time and desire to learn, you can find whatever you need online.
However, passively reading articles or watching videos alone won't get you far in your journey to improve your testing skills. As with learning any new skill, you'll need hands-on practice if you want to get better. There's no better teacher than rolling up your sleeves and getting into the action. That's the main reason why I spent months building a custom web application to complement the lessons in my book End-to-End Testing with TestCafe.
If you're fortunate to be a part of an organization that provides the opportunity to learn on the job, take advantage of obtaining real-world experience with the products you work on. Unfortunately, many of us don't have that luxury and need to learn on our time and find our own resources to get that hands-on experience.
As mentioned earlier, it's easy to find learning material, but how would you go about finding applications that allow you to practice what you learn in as close to a real-world environment as possible? If you're lucky, some of the courses or books you find will have a small example you can use, but those rarely reflect what you'll find in any work environment.
Not all hope is lost, though. Thanks to plenty of generous individuals and organizations, you can find many resources to help with your testing practice. But even if you can't find readily-available websites or services to get hands-on experience, you can still find ways to get free testing environments for different kinds of tests.
End-to-end and API testing resources
The original focus of this article was all about web application testing, particularly with different places to get lots of practice with end-to-end and API test automation. I've stumbled upon countless websites and projects that allow testers to experiment and learn with their preferred testing tools throughout my career.
As I began doing additional research to organize the article, I stumbled upon an article titled Best Websites for Practicing Test Automation by David Mello, covering this exact topic. His article contains many useful examples and did a fantastic job covering most of the resources I planned to cover. I recommend reading David's article for a solid list of end-to-end and API testing resources.
Out of the websites that David mentions, my favorites are UI Test AutomationPlayground and Swag Labs by Sauce Labs to learn and practice UI test automation for websites, and Restful-Booker for API test automation. In addition to the websites listed in the article, I also wanted to mention Airport Gap, a simple application I built to use in Dev Tester articles and intended to help others learn the ins and outs of JSON APIs.
Other testing resources
If you search online for different sources to get hands-on testing practice, you'll find that most of the focus is on web applications for UI testing or API playgrounds. I guess that it's relatively easier to develop and manage these kinds of mock applications than building and distributing a desktop or mobile application. Also, some forms of testing carry additional implications, as you'll read below.
In short, if you wanted to study and practice different types of testing outside of API or UI testing on a website, there's very little to find. But that doesn't mean you're stuck without any way to experiment and practice. Although you may have to do a bit of extra work to set up your testing sandbox, you'll still have a few options at your disposal.
Doing any form of security testing online is tricky, mainly due to certain interpretations of the law. Technically speaking, attempting to access or perform specific actions intended to intrude upon a computer system can be illegal in some areas. Because of the high risk of malice and abuse by some users, not many places will grant you the permission needed to poke around their systems.
Even with these restrictions in play, I've found a few excellent resources focused on teaching how to spot, exploit, and fix common security vulnerabilities.
Gruyere is a codelab specifically built to show how to exploit web application vulnerabilities and learn how to defend against them in your applications. The codelab explains different exploits you'll find in modern websites, allows you to run the attack, and explains how to fix it, so you don't fall victim to these attacks in your projects. It's one of the best security-related sites I've seen for web apps, and you'll learn a ton of ways to protect your websites.
Another unique web application is bWAPP (or buggy web application). This open-source app contains over 100 vulnerabilities, ready to be exploited for your studying purposes. You'll need to set up bWAPP on your computer or server (or download the ready-made bee-box virtual machine), so it's not as readily accessible as Gruyere. Still, it's a great way to get additional practice for setting up a web app.
You're not just limited to web applications for security testing practice. If you're interested in learning about vulnerabilities in mobile applications, DVIA (or Damn Vulnerable iOS App) is an open-source iOS app containing lots of common vulnerabilities intentionally added into the codebase. While it doesn't have in-depth instructions on exploiting or fixing these issues like the previously mentioned resources, it allows you to learn in a controlled environment.
Mobile and desktop applications
You won't find a ton of mobile or desktop applications specifically built for testing purposes. As mentioned earlier in this article, these types of applications often have a higher cost to create and distribute compared to a web application. With web apps, you can build and host a site easily for cheap or even free, and it will work almost anywhere through a browser. With mobile or desktop applications, device and operating system restrictions limit their reach, and setting things up usually requires patience and decent technical know-how. Still, you can find some ways to learn.
One area where you can find practice resources is exploring different testing tools and libraries for mobile and desktop apps. Some of these tools provide sample applications for you to follow along while reading their tutorials. For instance, the mobile app testing tool Appium provides the source code for sample apps to use for learning purposes. Even if you don't use Appium, these apps can help you with other frameworks or libraries.
Another alternative is to use existing applications already installed in your device or operating system or download one that contains basic functionality. Let's say, for example, you want to learn how to use Microsoft's WinAppDriver for creating automated tests for Windows applications. You can practice on built-in apps, like the calculator or Notepad, or download another app from the Microsoft store. If you choose to download an app, select one with limited functionality (like a to-do list without fancy bells and whistles) to help you get comfortable with automation.
Load / Stress testing
An area that's difficult to find free practice resources is for load or stress testing. Since the purpose behind this kind of testing is to push an application far beyond its limits, it's not surprising that many places don't want their systems getting abused like this.
The best option I've found for learning to use tools like JMeter or WebLOAD for load and stress testing is to set up a test environment for your personal use on a local computer or cloud server. For example, suppose you're interested in learning how to stress test a web application. In that case, you can pick up a popular open-source application like WordPress or Magento and install it locally to provide a playground for you. Due to their popularity, you'll find help for getting those systems up and running if you're not comfortable with setting up these types of apps.
You also have the choice to spin up an instance of these applications on a hosting service like Amazon's AWS or DigitalOcean. These options aren't free, but they charge by the second or hour of use, so it's a very cheap alternative for some quick experiments. However, keep in mind that these services frown upon putting extra load on their servers, which is what load and stress testing does. Their terms of services often specify that if they spot you abusing their services, your testing can be considered an attack, which can have further implications. At the very least, you'll risk getting your account suspended. It's best to practice load and stress testing on your local network instead.
The best practice you can have is on your own projects
This article shows that you have plenty of options for finding applications for practicing almost any kind of software testing. But possibly the best way to get hands-on learning in testing is by looking at opportunities in the projects you're involved in. You're already familiar with them, and you'll find that your motivation increases to help improve the app with your expanded knowledge.
For instance, when I began with web development and wanted to learn how to avoid security issues like SQL injection or cross-site scripting, I asked for some time to practice at work on our staging environment. It helped uncover one particularly nasty exploit that I could patch quickly, and I learned a lot along the way about spotting security vulnerabilities the way. As long as you have permission from your organization and responsibly disclose your findings, it's an easy way to pry into a real-world project.
Another example occurred at an e-commerce organization. The company partnered with a large Internet entity to provide access to our internal APIs, which they would use to display some information on their public-facing website. Since our product was relatively unknown at the time, and the partner's website had thousands of daily visits, we weren't sure if our systems could withstand this level of access. To make sure we didn't run into problems, we built a server in the office to replicate our production environment and ran tons of tests. It gave us an excellent opportunity to learn how to stress-test an API in a safe space for our system.
The point here is to be on the lookout for places close to you that might give you the perfect opportunity to learn. Usually, you don't have to look very far to find what you need.
Thanks to the Internet, you can find learning material for anything related to software testing. Countless books, videos, and blog articles can teach you about any tool, framework, or methodology you're interested in studying. Even with all this information available at the click of a button, you'll still need hands-on practice to get better at testing.
Fortunately for us as testers, we also have plenty of resources to help us gain real experience outside of passively learning. For some testing types, such as API or end-to-end web application testing, you'll find tons of ready-to-use websites that you can begin using right now. For other kinds, like stress-testing a server or automating tests for a Windows application, you'll probably have to put in a little extra work, but you still have enough options to move forward.
Before looking for resources online, you might want to spend time checking if you have opportunities close to you. Chances are you want to bolster your skills for your job or a particular project. Is there a possibility of carving out some time on your work schedule to practice the skills you need on the projects you're working on? It'll give you real-world experience, along with improving your work projects - that's a win for everyone involved.
Reading and watching videos gets you started, but nothing beats hands-on experience. We've all heard the expression "practice makes perfect." Just like every worthwhile attempt for something you want to improve upon, you'll need lots of practice to become the best tester you can be.
What other resources have you used successfully to sharpen your testing abilities?