Software Testing Shouldn’t Require Expert Coding Skills
Discuss this topic on The Club.
by Claire Reckless
If you’re following lots of testers on Twitter, are part of the MoT or Testers.io Slack, read testing blogs, or are just generally keeping up (or trying to keep up) with all the goings on in the testing community, you can read about how everyone is setting up shiny new automation frameworks, solving Selenium related automation problems, and getting to grips with the latest cool tools and programming languages..
But, what if you aren’t one of those people? If you are a tester who can’t code, doesn’t want to, who doesn’t know what to learn or does but doesn’t know how to go about it, what can you do?
It can be easy to start feeling a bit unsure about whether you have the right skills, and whether there will be a place for you in a testing role in the future. Feelings of being a second class tester start to creep in. This can be made even worse by the articles out there proclaiming that there is no place for testers who can’t code in a future testing industry. The question about what testing roles will look like in a number of years time raises it’s head quite often and many are of the view that more and more companies will ask for some kind of programming skill as a requirement.
So, as a tester, is programming one of the most important skills you should have, or try to develop? There are some tasks where programming knowledge will always be needed. However, there are also things you can do to increase the depth of your testing skills without knowing how to code.
My Programming Experience So Far
For transparency, I speak from the perspective of someone who has written code. I’ve written automated checks in VB and C#, and created small scripts in other languages to help me do bits and pieces. However, I don’t write code on a daily basis and I am by no means proficient in any particular programming language. It can feel quite hard to admit that when I see what everyone else is doing, and at times I’ve wondered if I could be much better at my job if I sat down and invested the time in becoming more skilled at it.
When I became a tester I had some experience in using the Command line, and writing SQL queries. I came from a tech support background, but hadn’t really been exposed to writing code. I’ve spent most of my testing career to date exploring, investigating, learning and discovering without coding. Though I fully realise that exploratory testing and programming are not mutually exclusive. In my current role it’s becoming more and more necessary for me to understand and write code, so I’m learning as I go along and getting assistance from others.
So Why Still Talk About This?
This subject has been written about and debated by a great many people. A few years ago this article asked ‘can we move on’ from this debate, it also referenced a number of other articles by prominent members of the testing community with a variety of opinions. It’s another one of those subjects we might never all agree on.
Our industry is evolving all the time, it could be that in a future testing industry almost all testers will be required to have some programming experience, and while this may not happen, it’s important to be aware of it.
Whether or not you need to learn programming skills is, as with so many other things, dependant on your context. As a lot of companies move toward continuous delivery, there is increasing reliance on automated checks, DevOps, testing and monitoring in production. If you are working in this kind of environment you might be expected to be able to code. Some are of the opinion there is no place for testers who can’t code anymore, when actually, the wide range of skills testers demonstrate can be of great use for all stages of the development cycle, whether you are using DevOps, Agile, or something else.
Talking about programming, from a tester’s perspective, is a good way to self reflect and look at where you think you could be stronger and make the most effective contribution to your team and your own career. If you can’t code, or don’t want to be an automation engineer, there are other related things you could learn.
Getting Hired - What’s The Role?
Some employers will only hire testers who have coding skills. They need to do what fits their business needs best. They might want their testers to create new frameworks and write unit tests, API tests, or UI level automated checks as part of their day-to-day work.
Most modern frameworks are constructed using code rather than the much maligned record and playback tools which, in theory (and in the fancy sales pitch), ‘anyone could use’, but in practice, were often brittle and unreliable, and discarded after a lot of expensive effort. It makes sense to want candidates who can create robust automated checks in code, suggest improvements to the framework, and evaluate new technologies.
Roles Which Require Programming
If your interests are in specific areas of testing, like performance or security, a good knowledge of how the code works can be beneficial. However, this needs to be combined with other things like good technical skills, the ability to use, or learn to use, the necessary tools, and knowing how to interpret the output of the tool. Having done a security testing training course as part of my current role, I found it was extremely technically focussed and a good understanding of the inner workings of an application was required in order to search for less obvious, yet serious, security flaws.
James Bach wrote about different types of testers, one of which was the ‘Testing Toolsmith’. It’s the Testing Toolsmith’s job, amongst other things, to identify what tools can be created to support testing and to create those tools. Clearly, to be able to take the kind of role where you write your own tools is going to require programming skill.
Similarly, the Software Development Engineer in Test role which some companies have, requires you to be a developer, and as a result be able to demonstrate good programming skills. You write software, to help test software. This might be an automated checking framework, performance testing tools, or other custom tools. You could also be configuring continuous integration tools. You might have full access to the application code and be working with developers to create unit tests.
The Local Job Market
In the UK, a lot of job advertisements for tester roles, from entry level to more senior, don’t contain a requirement for knowledge of a particular coding language or even a vast amount of coding experience. Some state that exposure to automation is a necessary requirement, though do not mention specific coding languages.
Requirements for a position can differ from area to area. In London for example, you might find programming experience more of a requirement than a testing job elsewhere in the U.K.
Many roles based in the U.S, or India, for example, have some level of programming skill as a ‘must have’. You might not get an interview without it. Discovering the general trend in your area could play a factor in whether you should adopt programming skills.
If you can't code, but want to learn, then looking for an opportunity to do so could be a good option.
Applying for an internship which requires coding
Elisabeth Hendrickson did an interesting study in 2010 of tester job advertisements in the U.S and found over 80% of them requested some sort of programming skill. This included ads which stated knowledge of a programming language as a ‘nice to have’, as well as those with a requirement for the applicant to use a programming language.
Coding Doesn’t Always Mean Checks
If you do want to learn to code, it doesn’t mean you have to use your new found skills spending all your time writing automated checks. This seems to be the focus for a lot of companies who list programming as a required skill where the word ‘Automation’ is used in job ads.
Automation is a bigger animal than just checks. You can automate all sorts of other things, so when you think about automation, don’t restrict your thinking to one definition. Testers should think about where else code can help them. Use it to support testing activities and help you, not replace what you do. Below are some examples of what problems code can solve for testing purposes, and if you are an inexperienced or non coder, tackling some of these could help boost your skills.
Data generation is a much needed part of testing
Can you write something to help you generate your test data quickly? I did this to create a large quantity of data for an application by running a small script using a loop. It would have been incredibly time consuming to do it manually. I could get on with other things while my data was generated.
Analysing output data or test results
If your test output includes a lot of data, instead of wading through spreadsheets you can use code to help you make sense of what you are looking at. Rosie Hamilton talks about how she taught herself R, a language used for Data Analysis, and used it to help her with the data collected as part of her survey of testers.
Coding or scripting to save you time
It’s the same with any repetitive processes you have, if you can code it or script it, it will that save you and others time. Loads of testers have small code snippets or scripts uploaded to Github that they’ve written. For example, to take the tediousness out of repeatedly launching websites in different browsers, you can find code snippets which will launch those for you. It can make a real difference when things which seem like small tasks, but become tedious over time, are made much quicker and easier to perform. If you’re just starting to learn code, look for everyday testing tasks to turn into mini projects. It could be a great start and help you learn how a coding language can work.
On the subject of what language is the best to learn, which is another questions that pops up fairly frequently, again, it depends. When deciding, take into account what the developers you work with use, what you intend to use it for, and what kind of support you can get.
Learning Other Technical Stuff
I’ve found that, while my coding skills are at the beginner stage, getting a technical understanding of how an application works internally means I’m able to think about where there might be risk, formulate test strategy, and come up with more inventive ways to test.
If you don’t know about some of these things, a great way to understand the internal workings of a software product is to talk to the people who write the code, the developers, or architects. Ask them questions, more often than not, they will be happy to share their knowledge!
What are the different components of your application and how do they fit together? Knowing this can help you assess the impact of any changes which are made during development and devise your testing strategy accordingly.
You don’t need to know how to code to be able to model out and test API’s and web services using tools like Postman but once you are more comfortable with how they work you could think about using code to create or use an automation framework to do this.
How is data stored? Database query languages can be easy to start with and are really powerful for testers to be able to verify, manipulate and create data for use in testing.
Knowing about the application architecture is important for doing things like threat modelling exercises where you decompose the application, identify threats and determine strategies for mitigation. Writing code as a tester isn’t essential here, but knowing if your developers are following secure coding principles is a great start.
Why have certain technologies been chosen over others? If, as a tester, you are involved in discussions around technology choices you can bring your skills here. Are there particular disadvantages to the technologies used which could cause your users problems? What third party libraries or modules does the application use? Find out if there are known issues with these which might lead to bugs your application.
Command Line and Scripting Languages
If you work with technologies like Linux, Windows, or other operating systems, knowing something about tools like PowerShell, or the Command Line, can be extremely powerful. I work in an environment where these tools are used extensively and wouldn’t be able to do my job well without being able to use commands, and understand and interpret errors.
The more testable an application is, the more likely it is it will be easier for your users to know what’s going on, and will be easier to support. Does the application generate any log files which you can use during testing? If not, is it possible for the developers to incorporate logging? Additionally, when technical decisions are being made about the software, it’s worth taking automation into account. If you know you want to write automated checks then you need to make sure the components it’s built from will allow you to do this.
Tools like Fiddler,or BurpSuite, enable you to see the contents of requests and responses from your web application. Similar to some browser tools you can intercept and manipulate the requests and view the responses, you can modify and replay requests. Some of them also let you run security scans to look for vulnerabilities. You don’t need to write code to use them, but knowing how to interpret the results is a must to get the most value from them.
Other Important Skills
These are all things I found to be important as a tester and none of these things necessarily require knowing a programming language:
Being able to learn quickly
Understanding operating systems, browsers, and infrastructure
Critical thinking and asking questions
Theoretically, someone could decide to become a tester without any experience related to testing, development, computing, or critical thinking at all. You wouldn’t be certain they would be any good at it, but neither could you assume they would be terrible. There are no academic or professional qualifications required to become a tester and there isn’t a requirement to attain a certain level of programming or technical knowledge before doing so, whether you agree with that or not.
It’s Not All About Coding Then?
I disagree with those who say that we can and should ‘automate everything’ and we don’t need testers anymore, especially those who can’t write code. Really good investigative and exploratory skills are something testers can always bring to the table by working with everyone else on the team.
I think it’s not necessary to know a programming language to become a tester. I do think as new testers build up their knowledge, they should aim to have a deeper understanding of how their application works. Speak to developers, tech architects, and anyone else who has this knowledge and ask questions. These conversations alone could end up uncovering interesting things. It’s important however, have an awareness of the requirements of the company you work in, and also where you want your career to go. You might find it’s necessary to learn programming to get where you want to be.
For those who do want to learn to code but don’t know where to start there are a wealth of resources out there to help you. Learning to code could be as easy as adding tests to an existing automation framework. Try editing an existing test or adding a new test. Think about casting your net wider than automating tests. Pairing with someone else on your team to learn coding skills could be a first step in a long journey. Whatever you decide, the choice is yours and there is still room in the industry for non-coding testers.
About Claire Reckless
Claire Reckless is a tester at Avecto, working on endpoint security software. Her passion is in helping people learn how to become better testers. Her domain expertise also includes financial and ERP software. Claire lives in Manchester, with her husband Rob, their cat, Max, and Ted the dog. She also enjoys running as time allows. You can find Claire on her Twitter.
Discuss this topic on The Club.