17.scala编程思想笔记——测试
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50444161
源码下载连接请见第一篇笔记。
健壮的代码必须不断测试,即在每次修改后都需要测试。
不断测试是快速程序开发之根本。
使用println来验证代码的正确性是一种比较弱的方法。
使用assert可以自动运行,但是失败会产生噪声输出。
书中设计的测试框架如下:
package com.atomicscala
import language.implicitConversions
import java.io.FileWriter
class AtomicTest[T](val target:T) {
val errorLog= "_AtomicTestErrors.txt"
deftst[E](expected:E)(test: => Boolean){
println(target)
if(test ==false) {
val msg ="[Error] expected:\n" +
expected
println(msg)
val el=new FileWriter(errorLog,true)
el.write(target + msg + "\n")
el.close()
}
}
def str = //Safely convert to a String
Option(target).getOrElse("").toString
defis(expected:String) = tst(expected) {
expected.replaceAll("\r\n","\n") == str
}
defis[E](expected:E) = tst(expected) {
expected ==target
}
defbeginsWith(exp:String) = tst(exp) {
str.startsWith(
exp.replaceAll("\r\n","\n"))
}
}
objectAtomicTest {
implicit def any2Atomic[T](target:T) =
new AtomicTest(target)
}
编译之如下:
scalac AtomicTest.scala
然后可以使用这框架了。
调用的程序如下:
val v1 = 11
val v2 = "a String"
// "Natural" syntax for test expressions:
v1 is 11
v2 is "a String"
v2 is "Produces Error"
执行如下:
其中V1 is 11 是调用v1.is(11)的调用写法。
[root@localhost examples]# scala -nocompdaemonTestingExample.scala
11
a String
a String
[Error] expected:
Produces Error
编写测试程序可以确保程序获得期望的结果。许多人倡导在编写实现代码之前就编写测试,严格地讲,应该在编写代码使测试通过之前,先让测试失败,这种技术称为测试驱动的开发(TDD)。