在Ruby中测试整个脚本

时间:2016-11-01 16:49:43

标签: ruby testing

测试整个脚本的最佳方法是什么?我想测试脚本是否返回(打印)正确的结果。到目前为止,我所拥有的是另一个或多或少的脚本:

Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/matplotlib/backend_bases.py", line 1305, in _on_timer ret = func(*args, **kwargs) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/matplotlib/animation.py", line 1049, in _step still_going = Animation._step(self, *args) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/matplotlib/animation.py", line 855, in _step self._draw_next_frame(framedata, self._blit) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/matplotlib/animation.py", line 873, in _draw_next_frame self._pre_draw(framedata, blit) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/matplotlib/animation.py", line 886, in _pre_draw self._blit_clear(self._drawn_artists, self._blit_cache) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/matplotlib/animation.py", line 926, in _blit_clear a.figure.canvas.restore_region(bg_cache[a]) KeyError: matplotlib.axes._subplots.AxesSubplot object at 0x1067718d0

import sys, os, random
from PyQt5 import QtCore
from PyQt5.QtWidgets import *

import numpy as np
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.animation as animation

class MyMplCanvas(FigureCanvas):
    """Ultimately, this is a QWidget (as well as a FigureCanvasAgg, etc.)."""
    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)
        # We want the axes cleared every time plot() is called
        self.axes.hold(False)

        self.compute_initial_figure()

        #
        FigureCanvas.__init__(self, fig)
        self.setParent(parent)

    def compute_initial_figure(self):
        pass

class AnimationWidget(QWidget):
    def __init__(self):
        QMainWindow.__init__(self)

        vbox = QVBoxLayout()
        self.canvas = MyMplCanvas(self, width=5, height=4, dpi=100)
        vbox.addWidget(self.canvas)

        hbox = QHBoxLayout()
        self.start_button = QPushButton("start", self)
        self.stop_button = QPushButton("stop", self)
        self.start_button.clicked.connect(self.on_start)
        self.stop_button.clicked.connect(self.on_stop)
        hbox.addWidget(self.start_button)
        hbox.addWidget(self.stop_button)
        vbox.addLayout(hbox)
        self.setLayout(vbox)

        self.x = np.linspace(0, 5*np.pi, 400)
        self.p = 0.0
        self.y = np.sin(self.x + self.p)
        self.line, = self.canvas.axes.plot(self.x, self.y, animated=True, lw=2)




    def update_line(self, i):
        self.p += 0.1
        y = np.sin(self.x + self.p)
        self.line.set_ydata(y)
        return [self.line]

    def on_start(self):
        self.ani = animation.FuncAnimation(self.canvas.figure, self.update_line,
                                 blit=True, interval=25)

    def on_stop(self):
        self.ani._stop()



if __name__ == "__main__":
    qApp = QApplication(sys.argv)
    aw = AnimationWidget()
    aw.show()
    sys.exit(qApp.exec_())

在此示例中,我要测试的脚本称为script.rb。 欢呼声。

2 个答案:

答案 0 :(得分:3)

使用test-unit,最终得到的代码如下:

class TestScript < Test::Unit::TestCase
  def test_output
    assert_equal 'test', `script --options`
  end
end

在处理程序输出时,您可能希望使用open3库,因为这样可以更好地控制处理方式。您也可以为此编写自己的包装器,例如assert_output_equal

def assert_output_equal(output, command, message = nil, &block)
  Open3.popen3(command) do |stdin, stdout, stderr, wait_thr|
    assert_equal output, stdout.read, message, &block
  end
end

你可以添加它来测试你的过程中的状态,确保它成功,并且STDERR上没有任何输出等。

当涉及到测试产生大量文本输出的东西(例如JSON数据,格式化列表)时,我发现在test/expect之类的地方创建文件并将文件与输出而不是定义源中的文本。这样可以轻松地创建文件:

old_script > test/expected/old_script.default
old_script --option > test/expected/old_script.with-option

当需要在那里调整某些内容时,它还使您的版本控制差异更容易阅读。

答案 1 :(得分:1)

定义测试夹具

  

测试整个脚本的最佳方法是什么?我想测试脚本是否返回(打印)正确的结果。

您需要一个包含已知输入值和预期结果的测试夹具。换句话说:

  1. 给定已知输入值
  2. 运行程序时
  3. 然后,您将收到预期的答案作为输出。
  4. 请注意,以这种方式测试整个程序可以告诉您是否从一组输入中获得了正确的结果,但通常可以提供对问题所在位置的深入了解。然而,许多形式的验收测试使用这个&#34;黑盒子&#34;测试的方法,只要你了解其局限性,它肯定是一种合理的方法。

    可能的框架

    可能的测试框架列表不是无限的,但如果您不想从头开始编写自己的测试工具,您可能想尝试一种比较流行的测试工具。启动自己研究的一些可能性包括:

    当然还有很多其他的,但根据您的原始问题,您可能希望专注于ATDD或BDD测试工具,而不是单元测试,如果您想测试整个脚本而不是其组件部分。