Well, your question is related to a broader context: Software Test Management.
A good basic guide, is the booklet used for the study of certification ISTQB (International Software Testing Qualifications Board): Download for free on this page.
That said, you will need coverage on two fronts. I will comment here based on my experience in managing Quality Assurance.
On the Development Side
Programmers must produce tests with unit tests. But not only that: the tendency of programmers is always to test only the most positive case possible. It is necessary to always test several negative conditions: cases in which the system is expected to be ready to react to a negative situation. For example: in an unauthorized access attempt (a negative situation), the system must respond amicably that access is not allowed, rather than "overflow" Exceptions pro user.
In addition to positive and negative unit tests, over time this list should include bugs. Each new bug that appears and is fixed needs to be added to the unit test list to avoid regression bugs.
How to Manage on the Development Side
There is no need to have someone in a role especially dedicated to it. But it is necessary to have a technical leader with experience in Software Quality. And if, on the one hand, we don’t need a new job, we need a software infrastructure that supports it. The ideal in this case is to have an integrated version control environment with Continuous Integration.
I will cite some software as an example, but of course what is described here can be adapted with the software you already use.
For Version Control: use the Git + Github. The first offers you the tool, while the second offers you a repository with navigable web interface, wiki, management issues, among many other features. It is also free for public repositories.
Still use, in what concerns version control, the flow called Feature Branch: no one should ever work on the main copy (called master in git, trunk in the SVN).
Each new Feature or bug will be worked on by the developers in a new branch separately, which should be tested by the developer himself locally.
After finishing the new code branch, then the programmer will be responsible for writing and implementing the related unit tests. A parenthesis here: although I have commented on writing the tests afterward, there is much discussion on this. Some recommend write all the tests before, others say that making this requirement is always a little too radical (including the author of the TDD himself), and some write the tests only after.
That’s where the Jenkins (or another Continuous Integration tool): it will monitor the repository (Github) and automatically trigger the execution of tests every time someone updates some branch.
If all goes, ok, new code accepted. If not pass, it is the obligation of the developer who sent the broken code to fix it until the tests pass (or update the tests, if this is the case).
Once Jenkins has warned that all tests have passed, the programmer will generate a request for pull request, which is a request to join (merge) the current arm with the master. This allows working code not to be broken, and gives programmers a better view of the source code history.
Who should approve or fail the pull request is the technical leader.
Ideally, Jenkins results and code submissions should be viewed by the entire team, such as emailing or shown in some collaboration tool (such as Teams or Slack).
In fact, it should be mandatory for the entire team, developers and testers, to go online on any of these tools. Because in addition to the communication itself being facilitated (and today it is quite common to remote work, which is my case), these tools can receive warnings from tools (such as Jenkins or Github), and send emails automatically if the recipient of the message is away or offline.
From the Side of the Testing Team
Yeah, you’re gonna need a test team. Programmers are always on a tight schedule, they know a lot about the program (while the end user isn’t), they tend to always test the most positive flow possible, and if they’re inexperienced, they’ll think that the first code that comes out will be a masterpiece, so close to perfection, and any bug will be like pointing a defect in a child. While an experienced programmer knows that finding bugs is a good thing, after all programming is a complex activity and always produces bugs.
For testing, the obvious: testers trained in Quality Assurance. After all you ask the driver of your team to take care of the mechanics of the car, or for someone with training in mechanics?
That being said, the testing team will first need to know in depth the requirements, use cases, cards, or whatever the requirements are stored in.
Based on them, and the blackbox techniques, they will need to write a good list of MANUAL tests.
Contrary to popular belief, manual testing is much faster to be detailed and performed. Automating tests, especially involving the UI is a VERY complex, time consuming and expensive activity. Moreover, at first, it is not clear which features are stable, and which will be in continuous change. Therefore, we cannot spend time and resources automating tests that will soon need to be changed in the face of changing requirements.
After detailing the manual tests and storing them in some testware tool, the tests should be prioritized, as it will often not be possible to run all the tests. The priority will come from the time available, the importance of each tested part, and yet there is always a part of the software (usually the most complex) that has more bugs than all the others (principle of grouping defects - bug clustering).
Then, on the planned deadline, the selected tests will be run. The results stored in this same testware tool. And bugs will be opened, fixed by developers, re-tested and closed or re-opened.
With these tests in hand, it is possible to select some of them for a regression test group. This test group will always run every new cycle, to ensure that existing functionalities are not broken.
After some executions, it will be clear which of the manual tests will always be performed. These tests will be strong candidates to be automated (with the help of some automation tool, obvious).
How to Manage on the Testing Side
Someone from the test team with some experience in Project Management should be in charge of the management activities. After all, the activities are the same as a project: managing human resources, setting priorities (after all, one of the rules of testing is that testing is impossible), estimating and responding by deadlines, reporting metrics, etc.
The Bugs
Bugs must have the following characteristics:
- A clear and short title;
- Tell which version of the system affects;
- Tell which release is expected to be fixed (this can be added later by the development team);
- Tell which operating system, version and browser (if applicable) bug was found;
- A detailed description, including all the necessary steps to reproduce the bug;
- Expected result;
- Current result;
- Preferably captured screens, or better still, a recorded video.
- An assigned handler, even if initially someone is responsible for sorting bugs.
Some considerations
It is necessary to create the mentality, in the whole team (development and testing), that the goal of both is the same: to deliver as bug-free software as possible.
The testing team does not audit the development. Bugs will always exist, and both will work towards the same goal.
The development team can’t be sad when a bug is found, after all finding a bug (that existed before) is a good thing.
The test team should be extremely versatile in communication (both in writing well, and in being kind in communicating), and be inquisitive in nature. You should want to understand the software, question the requirements when dubious, and be persistent when you believe a bug is important.
And, Software Quality, is everyone’s responsibility: who writes the requirements, who reads them and notices something missing, the programmers, the testing team, anyone.
Test and test. Having unit tests and a well-documented public API is the key. It is also worth using tools to check if the tests are covering the whole code (Coverage tools). Repeating these tests in various environments is a good one too (something like Travis-CI can help).
– Guilherme Bernal
It’s @Guilhermebernal, good practices are interesting, but nothingness, absolutely nothing, guarantees the absence of problems. No programmer, however good, can have the whole structure of a program in mind.
– utluiz
@utluiz De facto. The bigger the project, the greater the amount of regressions you will find later, no matter how careful. Hence it is interesting to have a method to update the post-release system. Another thing that helps is the peer-review, have other people working and reviewing your code.
– Guilherme Bernal
Okay, no trouble nobody’s gonna make it. But surely there is a minimum core of practice/knowledge, factually grounded, that guides the process so as to minimize the problems, no?
– Carlos Cinelli
@Guilhermebernal asked the question badly, but I believe it is not broad, you started to touch the points correctly. Can’t we edit it to make it better!?
– Carlos Cinelli
@carloscinelli did not find it so broad (but maybe you should limit the scope a little more and define whether or not you are talking about R). Give example of some real case and ask what could have been done to avoid for example. (not to extend discussion here, search for me in chat if you want)
– Guilherme Bernal
Reduce the coupling among the various components also helps a lot - in general new requirements interfere little in the old ones, so that if the components are decoupled those that have not been directly changed should not suffer behavior change. In addition, maintain unit tests as already mentioned, and if possible create regression testing where applicable (it is important that - before any release - a full system test is carried out, even in those parts which have not been modified).
– mgibsonbr
P.S. I didn’t find the question too broad either. It’s clear to me that the mention of the
R
refers to the context, and not to the question itself, and although a complete answer in fact would be very extensive, nothing prevents a proposed "Checklist" to guide in the task of preventing such defects (I’m quite interested in such a response too, despite my several years developing I feel I still know little about regression). I’ll indicate the question for reopening.– mgibsonbr
@mgibsonbr thanks for resurrecting the question, I edited it to see if now will!
– Carlos Cinelli
@Guilhermebernal helps to reopen?
– Carlos Cinelli
I added more information about coordination/management.
– Rael Gugelmin Cunha