时间一长,就开始思考根本原因。我认为Web程序的测试难以进行就在于HTTP是无状态的通信协议,而在几乎所有的Web应用程序中,又都需要记录用户的状态。因此有了Cookie和Session这些东西,而这些东西严重依赖于浏览器和服务器。再者,测试归根结底是把程序的输出结果跟预期结果相比较,但Web程序的输出是什么呢?通常的理解是浏览器里显示的Web页面,但Web页面内容在语义上并不十分严格,通过简单检验输出来进行测试既不切实际,也无必要。
退一步说,对于MVC结构的Web程序来讲,实质性的代码有一部分在Model层中。这个Model层应该是和浏览器、服务器环境没有耦合的,这样才能够比较方便地进行自动测试。但在Controller部分中通常也会包含重要的流程,而Controller通常都需要Web服务器的配合。
在Java的技术中,“解耦”往往表现得淋漓尽致。Struts 1把程序分成了明显的M、V、C三部分,但Controller还不得不依赖一些Servlet的API,如HttpServletRequest;到了 Struts 2,不仅不需要Servlet的API,甚至连Struts本身的API都不必依赖。由框架本身统领起整个应用程序,而实际的功能则由类似于挂接在整个机器上的一些小部件来实现,这些小部件并不去使用整个机器的功能,而是由机器统一驱动这些零件来工作。我想这应该就是人们常说的“控制反转(IoC)”吧。
如果能很好地解耦,才能更顺利地实施测试。只要测试的成本变得非常低,低到运行整个测试只需要按一两个键的时候,测试才能真正起到作用。