首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GNUs Coreutils‘fmt效用的差异检验

GNUs Coreutils‘fmt效用的差异检验
EN

Stack Overflow用户
提问于 2015-09-24 03:49:06
回答 1查看 61关注 0票数 1

我正在探索各种测试策略(差异、回归、单元等),并被分配了测试GNUs Coreutils http://www.gnu.org/software/coreutils/manual/html_node/fmt-invocation.html#fmt-invocation实用程序的任务。我试图应用随机微分测试并创建一个oracle,以便断言所描述的实用程序的后置条件是满足的。

我想要做的是创建一个Python实用程序,它生成一个随机字符串,将文本包装应用到字符串(直到给定的行宽)以生成一个预期的输出,然后对生成的字符串调用fmt实用程序,并断言输出与预期的输出匹配。为此,我试图利用textwrap模块。然而,我还没有找到一种方法来确保压痕得到保持。考虑一个包含内容的文件(file.txt)

代码语言:javascript
复制
\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将导致输出:

代码语言:javascript
复制
 \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函数如下:

代码语言:javascript
复制
textwrap.fill(in_str, width=50, expand_tabs=True, drop_whitespace=False, fix_sentence_endings=True, break_on_hyphens=False)

根据Python文档,应该执行以下操作:

  1. 包装线的最大长度将等于宽度参数(50)。
  2. 输入中的所有制表符都将扩展为空格。
  3. 在每一行的开头和结尾(包装后,但在缩进之前)的空格将被删除,而不是,而不是
  4. 假设一个句子的结尾是一个小写字母,后面是'.‘、'!’或'?‘之一,后面可能是’‘或’或‘’之一,后面是空格。
  5. 只有空白才会被认为是行间隔的潜在好地方。

但是,相同输入上的textwrap.fill函数的输出返回:

代码语言:javascript
复制
\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实用程序?任何建议都是非常感谢的!

EN

回答 1

Stack Overflow用户

发布于 2016-03-28 21:02:10

尝试使用py.test运行此代码段

代码语言:javascript
复制
#!/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

它应该向你展示这样的东西:

代码语言:javascript
复制
> 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_indentsubsequent_indent参数的效果,并从输入文本中删除前缀。(类似于-p实用程序的fmt选项),在寻找现有技术和灵感的同时,我在这里找到了您的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32753000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档