In the context of software engineering, software quality refers to two related but distinct notions that exist wherever quality is defined in a business context: Software functional quality reflects how well it complies with or conforms to a given design, based on functional requirements or specifications. That attribute can also be described as the fitness for purpose of a piece of software or how it compares to competitors in the marketplace as a worthwhile product; Software structural quality refers to how it meets non-functional requirements that support the delivery of the functional requirements, such as robustness or maintainability, the degree to which the software was produced correctly.

Internal quality and external quality are key categories of software or code quality. Common measures and indicators of internal quality include cyclomatic complexity, code duplication, coupling, coherence, defects, error logs, self-documenting code, automated test coverage and coding standards to name just a few. External quality covers factors such as user friendliness, page load times, accessibility and conformance to requirements.

There are many tools available to help testers and developers to get feedback quicker. Tools are usually classed as manual test tools or automated test tools. For internal code quality measurement, there are a number of tools available such as SonarQube, FxCop, StyleCop, SourceMeter, Veracode, NDepend, Parasoft, Eclipse, Flay, Reek, RuboCop, and Brakeman. There are many other tools available.

External quality tools include JMeter, Selenium WebDriver, Sahi, Watir, Telerik Test Studio, WatiN, and many more.

Developers are ultimately responsible for internal code quality. Testers can assist developers with internal code quality by helping to build the automation required to provide developers with rapid feedback. Testers work predominantly with external quality factors. Testers constantly look to reduce manual testing effort through automation of testing. Automating testing activities where possible frees up testers to work on developing better testing strategies and focus on exploratory testing. Automated tests provide a repeatable, efficient and predictable safety net for the entire team to work within.