我正在探索各种测试策略(差异、回归、单元等),并被分配了测试GNUs Coreutils http://www.gnu.org/software/coreutils/manual/html_node/fmt-invocation.html#fmt-invocation实用程序的任务。我试图应用随机微分测试并创建一个oracle,以便断言所描述的实用程序的后置条件是满足的。
我想要做的是创建一个Python实用程序,它生成一个随机字符串,将文本包装应用到字符串(直到给定的行宽)以生成一个预期的输出,然后对生成的字符串调用fmt实用程序,并断言输出与预期的输出匹配。为此,我试图利用textwrap模块。然而,我还没有找到一种方法来确保压痕得到保持。考虑一个包含内容的文件(file.txt)
\s\s\s\sLorem ipsum dolor sit amet, consectetuer-adipiscing elit. Curabitur dignissim venenatis pede. Quisque dui dui, ultricies ut, facilisis non, pulvinar non.作为fmt实用程序的输入。调用命令fmt -w 50 file.txt将导致输出:
\s\s\s\sLorem ipsum dolor sit amet,
\s\s\s\sconsectetuer-adipiscing elit. Curabitur
\s\s\s\sdignissim venenatis pede. Quisque dui dui,
\s\s\s\sultricies ut, facilisis non, pulvinar non.根据fmt实用程序文档,
默认情况下,在输出中保留空行、单词之间的空格和缩进;不连接具有不同缩进的连续输入行;在输入上展开制表符,并在输出时引入选项卡。 fmt更喜欢在句子的结尾处断线,并试图避免在句子的第一个单词之后或句子的最后一个单词之前中断行。句子中断被定义为段落的结尾或以“.?!”结尾的单词,后面跟着两个空格或行尾,忽略了任何插入的括号或引号。
在试图模仿与fmt实用程序相同的输出行为时,我决定使用文本缠绕模块https://docs.python.org/2/library/textwrap.html#textwrap.fill函数如下:
textwrap.fill(in_str, width=50, expand_tabs=True, drop_whitespace=False, fix_sentence_endings=True, break_on_hyphens=False)根据Python文档,应该执行以下操作:
但是,相同输入上的textwrap.fill函数的输出返回:
\s\s\s\sLorem ipsum dolor sit amet,
consectetuer-adipiscing elit. Curabitur dignissim
venenatis pede. Quisque dui dui, ultricies ut,
facilisis non, pulvinar non. Duis quis arcu a
purus volutpat iaculis. Morbi id dui in diam
ornare dictum. Praesent consectetuer vehicula
ipsum. Praesent tortor massa, congue et, ornare
in, posuere eget, pede.如您所见,缩进级别没有保持。
我能最有效地利用什么工具和/或差异测试策略来测试fmt实用程序?任何建议都是非常感谢的!
发布于 2016-03-28 21:02:10
尝试使用py.test运行此代码段
#!/usr/bin/env python2.7
from textwrap import TextWrapper
input_tx = """\s\s\s\sLorem ipsum dolor sit amet, consectetuer-adipiscing elit. Curabitur dignissim venenatis pede. Quisque dui dui, ultricies ut, facilisis non, pulvinar non."""
output_tx1 = """\s\s\s\sLorem ipsum dolor sit amet, consectetuer-
\s\s\s\sadipiscing elit. Curabitur dignissim
\s\s\s\svenenatis pede. Quisque dui dui, ultricies
\s\s\s\sut, facilisis non, pulvinar non."""
output_tx2 = """\s\s\s\sLorem ipsum dolor sit amet,
\s\s\s\sconsectetuer-adipiscing elit. Curabitur
\s\s\s\sdignissim venenatis pede. Quisque dui dui,
\s\s\s\sultricies ut, facilisis non, pulvinar non."""
class Test_TextWrapper:
def test_stackoverflow_q32753000_1(self):
sut = TextWrapper(width=50, subsequent_indent="\s\s\s\s")
assert sut.fill(input_tx) == output_tx1
def test_stackoverflow_q32753000_2(self):
sut = TextWrapper(width=50, subsequent_indent="\s\s\s\s",
fix_sentence_endings=False,
break_on_hyphens=False)
assert sut.fill(input_tx) == output_tx2它应该向你展示这样的东西:
> py.test -v -k Test_TextWrapper
============================================== test session starts ===============================================
platform linux2 -- Python 2.7.11, pytest-2.9.0, py-1.4.31, pluggy-0.3.1 -- /usr/bin/python
cachedir: .cache
...
plugins: cov-2.2.1
collected 6 items
test_fmt.py::Test_TextWrapper::test_stackoverflow_q32753000_1 PASSED
test_fmt.py::Test_TextWrapper::test_stackoverflow_q32753000_2 PASSED
=================================== 4 tests deselected by '-kTest_TextWrapper' ===================================
===================================== 2 passed, 4 deselected in 0.03 seconds =====================================如您所见,我的第二个测试用例产生的输出与问题示例中显示的输出相同。
我目前正在为Python标准库textwrap.TextWrapper类编写一个小Python包装类。这个派生类将提供一个新的prefix关键字参数,结合initial_indent和subsequent_indent参数的效果,并从输入文本中删除前缀。(类似于-p实用程序的fmt选项),在寻找现有技术和灵感的同时,我在这里找到了您的问题。
https://stackoverflow.com/questions/32753000
复制相似问题