测试整个脚本的最佳方法是什么?我想测试脚本是否返回(打印)正确的结果。到目前为止,我所拥有的是另一个或多或少的脚本:
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。 欢呼声。
答案 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)
测试整个脚本的最佳方法是什么?我想测试脚本是否返回(打印)正确的结果。
您需要一个包含已知输入值和预期结果的测试夹具。换句话说:
请注意,以这种方式测试整个程序可以告诉您是否从一组输入中获得了正确的结果,但通常不可以提供对问题所在位置的深入了解。然而,许多形式的验收测试使用这个&#34;黑盒子&#34;测试的方法,只要你了解其局限性,它肯定是一种合理的方法。
可能的测试框架列表不是无限的,但如果您不想从头开始编写自己的测试工具,您可能想尝试一种比较流行的测试工具。启动自己研究的一些可能性包括:
当然还有很多其他的,但根据您的原始问题,您可能希望专注于ATDD或BDD测试工具,而不是单元测试,如果您想测试整个脚本而不是其组件部分。