Hello everyone! My name is Ilya Lyubimov. I have been working as a test automation engineer for 2.5 years. In the modern world, it is impossible to imagine software development without testing. Large companies invest a lot of money in quality departments, as users have certain expectations of the final product. And the business strives to satisfy them, trying to prevent possible errors in applications in advance. In some cases, development teams can do with manual testing, but in most cases autotests are necessary.
If you have decided to become an automation test engineer a reasonable question arises: "What knowledge is required at the entrance to automated testing?" I will try to answer this question in this article.
Courses
Training starts with theory—texts and documentation on basic frameworks and programming languages. And the theory of testing in principle. You can find it on the learning portals, for example:
- Coursera.org is probably the most popular resource on the planet for learning and retraining. You can even get a master's degree from a foreign university. There you will definitely find materials on automated testing. Beware: lots of English!
Basic concepts
It is also worth having an idea about the testing pyramid and various types of testing—you’ll find the information in Roman Savin's book. Next, what Agile and CI/CD are—these concepts often go hand in hand, so I advise you to find information about them on the Internet. A superficial knowledge will be enough for a start, the depth of understanding comes with experience. It is worth looking at what is and how do bug-tracking systems work, and how to maintain documentation (I will talk about this later).
Programming languages
The most common programming languages (PLs) for auto testing are Java, Python, C#, and JavaScript. In general, you can refer to the same learning portals I cited above, but there is one important point. You just need projects in your chosen language, which you can attach to your resume. Otherwise, how can you prove that you really know programming?
Software development basics
Here starts the hard part 😊. Basic knowledge of OOP (object-oriented programming), collections, data types, exceptions, loops, common frameworks and libraries, Git. Let's deal with some points separately (here and below I'll tell you about Java as an example).
OOP
Java is an object-oriented language, which means that the basics of OOP cannot be avoided. To begin with, we need to understand the basic OOP terms: encapsulation, inheritance, polymorphism, and abstraction.
From the article «Object-Oriented Design Principles»:
- Encapsulation is placing one object or class inside another to differentiate access to them.
- Inheritance is the ability of an object or class to be based on another object or class. It is the main mechanism for code reuse. The inheritance relationship of classes clearly defines their hierarchy.
- Polymorphism is the implementation of tasks of the same idea in different ways.
- Abstraction is the separation of a concept from its copy.
You need to be able to explain these terms in your own words terms and how they are implemented in the PLs.
Collections
First, you need to know the hierarchy of collections, what the difference is between List and Array, what the varieties of Map are, their difference, the complexity of operations. Second, what Set, HashSet, LinkedHashSet, TreeSet are, what principle is used to store data in collections.
So, Collection and Collections are different concepts. Collection is the root interface of collections, but Collections is a class consisting of methods that operate on or return collections.
The schemes of Collection and Map classes:
In the figures, the solid lines represent Extends relationships, and the dotted lines represent Implements relationships. These relations are important, and you will find all the information about them in Java theory.
Exceptions
As with collections, you need to know the Exceptions hierarchy, what the difference between an Exception and an Error is, what Checked/Unchecked Exceptions are, and some examples of them. In brief:
The root interface is Throwable. It has two "descendants"—Error and Exception. Error is a critical runtime error related to the Java virtual machine, so we can't handle errors, and that's it.
And if you can end up with Error so quickly, you can't end up with Exception. Not all subclasses of Exception are handled (Checked). Thus, the RuntimeException class is unchecked, which means that no matter how hard we try, we can't handle it. The compiler tells us that nothing suspicious was detected during the compilation (we usually trust the compiler) but something went wrong, and it means that there is a bug in the code. Examples of such exceptions are array overruns and arithmetic errors (division by zero).
Basic Knowledge of Test Automation
Now that we understand the basics of the PLs, we can talk about the basic test automation tools that we use in our work every day.
The work of a test automation engineer consists of three directions:
- User Interface. If we work with web applications and sites, we need a tool that allows us to check and interact with page elements. In most cases we use Selenium.
- Data Bases (DB). As a rule, you can get by with the knowledge of writing SQL queries without being bound to a particular DBMS (Data Base Management System). There are lessons in the SQL section, you can practice on your own.
- Backend. Test automation engineers write queries to the backend and check incoming data, excluding the display on the web page. Here we are helped by Postman, a utility for sending backend queries. And the RestAssured—it allows us to send queries in a clear readable form and map responses to the appropriate classes in our framework.
And what allows us to tie all these aspects of the test automation engineers` work together and write a full-fledged production-ready frameworks?
These are JUnit, TestNG, and, of course, Cucumber. The first two are libraries, they allow us to write and pick up tests from the code, structuring them into different groups. And thanks to Cucumber, we write frameworks using the BDD (Behavior Driven Development) approach. Its main idea is to use such verbal constructions in our tests that even a person who does not understand anything about programming will be able to read and understand each implemented test step by step. Gherkin Notation is used for this. You can read about Cucumber and Gherkin Notation here and here.
Git, Jira, Unix
Now that the necessary minimum of PLs and autotests have been analyzed, it is worth talking about related technologies and software development tools:
Git is a version control system that helps track who made what changes to the project and when. In addition, it allows to "roll back" changes and work in teams on the same functionality without the need for synchronization. This is an extremely important and integral part of the work of any programmer. You need to know how to work with it. Click here for more information.
Jira is an indispensable tool. My experience tells me that a huge part of companies uses Jira to maintain tasks and work according to the Agile methodology.
Unix systems. The vast majority of the machines on which the backend “spins” and application components are deployed run on Unix distributions. Therefore, it is very important to know at a basic level how to work with the system via a terminal on a remote machine by means of an SSH connection.
In my opinion, this is a necessary minimum of knowledge to confidently start in the profession of a test automation engineer. Perhaps you already knew this and just refreshed your memory. And someone will really benefit from this guide, and you will go to study something new and interesting with burning eyes. Because automated testing is exactly like that. Most importantly, do not forget to test, test and test again!