【问题标题】:How to use a unit-testing framework for a function that has a dynamic output in Racket?如何为在 Racket 中具有动态输出的函数使用单元测试框架?
【发布时间】:2016-10-18 00:02:17
【问题描述】:

我在 SICP 书上做练习 3.5。

Racket 中的 Monte Carlo 实现生成以下代码:

(define (monte-carlo trials experiment)
  (define (iter trials-remaining trials-passed)
    (cond ((= trials-remaining 0)
           (/ trials-passed trials))
          ((experiment)
           (iter (- trials-remaining 1) (+ trials-passed 1)))
          (else
           (iter (- trials-remaining 1) trials-passed))))
  (iter trials 0))

(define (random-in-range low high)
  (let ((range (- high low)))
    (+ low (random range))))
; questão propriamente dita
(define (estimate-integral predicate x1 x2 y1 y2 trials)
  (*(* (- x1 x2) (- y1 y2))
    (monte-carlo trials predicate)))

(define (circulo?)
  (>= 1 (+ (square (random-in-range -1 1))
           (square (random-in-range -2 1)))))

(define (estimate-pi)
  (estimate-integral circulo? -1.0 1 -2 1 100000))
; Fiquei brincando com os os parametros do retangulo, desde que o circulo continue dentro dele
(define square
  (lambda (x) (* x x)))

代码是正确的。 但是,我决定插入一些单元测试。

因此,我导入了 library rackunit 并使用了以下测试:

(require rackunit)

(check-equal? (estimate-pi) 3.00906)

这显然是一个问题,并且由于随机函数的输出是动态的,因此测试总是会失败。

在这种情况下我该怎么办?

【问题讨论】:

    标签: unit-testing random lisp racket rackunit


    【解决方案1】:

    对此有一个内置检查 - 首选解决方案:

    (check-= (estimate-pi) 3.1416 1e-4 "Incorrect value for pi")
    

    前面的检查验证结果是否在可接受的tolerance值(也称为epsilon)之内,它等价于:

    (check-true (<= (abs (- (estimate-pi) 3.1416)) 1e-4))
    

    1e-4部分是科学计数法的公差,表示如果实际值和期望值的差小于0.0001,那么我们认为结果是正确的。当然,您可以调整公差值以满足您的需要 - 数字越小,所需的精度越高。此外,如果check-= 不存在,我们可以定义自己的检查,这很有用,如下所示:

    (define-binary-check (check-in-tolerance actual expected tolerance)
      (<= (abs (- actual expected)) tolerance))
    
    (check-in-tolerance (estimate-pi) 3.1416 1e-4)
    

    【讨论】:

    • 太棒了!谢谢。但是 1e-3 是什么意思呢?
    • 还有check-=,就是这个的内置版本
    • @AlexKnauth 谢谢!我不知道那张支票;我更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多