"We don't have time to write unit tests" or "We don't have the budget for unit testing" are complaints I hear very often. Sometimes it may sound like, "We don't use TDD, so that's why there are no unit tests," or even "TDD is too expensive for us now." I'm sure you've heard this or even said it yourself. It doesn't make any sense to me. I don't get the logic. In my understanding, unit testing is not a product; it's a tool. You use tests to develop a product faster and better. How can you say you don't have time to use the tool that makes your work faster? Let me show you how.
TDD or not, a unit test is a unit test. Either you create it before the main piece of code or after it.
A unit test is a tool that helps you, a developer of software, "run" your stuff and see how it works. How else can you check if it works? When I hear, "I don't have time for unit tests," my next question is: "How did you test your code?"
I seriously can't understand how it is possible to write something and then not test it. Well, unless you're paid monthly and nobody really cares about your deliverables. If you do care about the software you produce, you're interested in seeing it in action, right?
So, how do you do this?
If it's a one-page PHP website, you can probably run it locally on Apache, modify it on disk, and then
R many times. That will work for a primitive piece of code and only for you, a single developer of it. But I hear this "I don't have time" argument from programmers working on enterprise systems. How do you guys test your code?
I would compare unit tests with OOP classes. You can design the entire application in a single class with a few thousand methods. You will save time on creating other classes, structuring them, thinking about connections between them, etc. It will be a single 20,000-line
.java file. And you'll say that "you didn't have time to create classes," right? What would we say about such a product and the author of it? Right, we'd say he or she is just stupid. And it has nothing to do with time or budget. Such a programmer just doesn't know how to use object-oriented programming tools, like encapsulation, inheritance, polymorphism, interfaces, method overloading, etc. It's not about time or budget; it's about skills and discipline.
The same is true for unit tests. If you create code without unit tests, it may work, just like that monster class with 20,000 lines, but the quality of your product will be very low. And not because you didn't have time to write unit tests, but because you didn't know how to do it.
So every time I hear, "I didn't have time for unit testing," I understand that you just didn't know how and are trying to conceal that fact behind false excuses. It's not professional, to say the least.