在测试包中访问包的内部符号

时间:2016-02-03 05:32:27

标签: testing common-lisp

我有一个程序,我想使用证明进行测试。目前,我有一个单独的测试包。我面临的问题是,我真的不想从主程序包中导出每个符号(我目前只导出一个符号),但我希望能够从测试包。

使用main-package::symbol是有效的,但是我很难猜测,这是个丑陋的想法。有没有更好的方法来做到这一点,而不必导出我的所有符号只是为了测试它们?我考虑使用相同的程序包来编写测试,但是当我仅将它用于测试代码时,我不希望在我的主程序包中有(:use :prove) 。是否有某种方法可以执行(:use :package)之类的操作,但只能用于一个文件?如果有的话,在这里使用它会有意义吗?

1 个答案:

答案 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)"之类的内容轻松地在新映像中运行测试(以确保磁盘上实际存在的代码版本)。如果你愿意,你当然可以把测试放在一个函数后面。