Software testing fundamentals