我有一个程序,我想使用证明进行测试。目前,我有一个单独的测试包。我面临的问题是,我真的不想从主程序包中导出每个符号(我目前只导出一个符号),但我希望能够从测试包。
使用main-package::symbol
是有效的,但是我很难猜测,这是个丑陋的想法。有没有更好的方法来做到这一点,而不必导出我的所有符号只是为了测试它们?我考虑使用相同的程序包来编写测试,但是当我仅将它用于测试代码时,我不希望在我的主程序包中有(:use :prove)
。是否有某种方法可以执行(:use :package)
之类的操作,但只能用于一个文件?如果有的话,在这里使用它会有意义吗?
答案 0 :(得分:4)
您可以将测试分成他们自己的系统。这样你的主系统根本不会依赖于证明。在测试系统中,您可以加载相同的源文件,但不同的包定义(当然这假定您将包定义放在不同的文件中,而不是使用将它们置于源文件之上的奇怪习惯...)
例如,主程序可能如下所示:
foo.asd:
;; Here I'm obviously putting the package def in the same file
(in-package :cl-user)
(defpackage :foo-asd
(:use :cl :asdf))
(in-package :foo-asd)
(defsystem "foo"
:components ((:file "foo-package")
(:file "foo")))
FOO-package.lisp:
(in-package :cl-user)
(defpackage :foo
(:use :cl)
(:export :foo))
foo.lisp:
(in-package :foo)
(defun foo (x)
(+ (bar x)
(bar x)))
(defun bar (x)
(* x x))
测试系统在同一目录中:
FOO-test.asd:
(in-package :cl-user)
(defpackage :foo-test-asd
(:use :cl :asdf))
(in-package :foo-test-asd)
(defsystem "foo-test"
:depends-on (:prove)
:components ((:file "foo-test-package")
(:file "foo")
(:file "foo-test")))
FOO试验package.lisp
(in-package :cl-user)
(defpackage :foo
(:use :cl :prove))
FOO-test.lisp:
(in-package :foo)
(plan 2)
(is (bar 2)
4)
(is (foo 2)
8)
(finalize)
这使您可以使用sbcl --noinform --eval "(ql:quickload :foo-test)" --eval "(sb-ext:quit)"
之类的内容轻松地在新映像中运行测试(以确保磁盘上实际存在的代码版本)。如果你愿意,你当然可以把测试放在一个函数后面。