在脚本语言中捕获拼写错误

时间:2010-03-21 12:43:56

标签: python ruby unit-testing scripting groovy

如果您选择的脚本语言没有类似Perl的strict模式,您如何捕捉错别字?你是否正在测试一切?每个构造函数,每个方法?这是唯一可行的方法吗?

10 个答案:

答案 0 :(得分:32)

真正彻底的单元测试是最重要的技术(是的,我总是以100%的覆盖率为目标),因为它们还会捕获许多其他拼写错误(例如我在哪里写+并且意味着-执行每个功能的集成和负载测试是抵御各种错误的第二道防线(主要是,更深层次和更难的错误; - )。

接下来是pylintpychecker等工具以及着色编辑器(我不使用真正的IDE,但它们也有助于我可靠的gvim编辑器的工作方式; - )。

强制性代码审查等技术(例如,参与我对该主题的访谈的视频here)虽然至关重要,但应关注其他问题 - 自动化的问题工具只是不会捕获,例如评论/文档字符串的完整性和正确性,优秀/快速算法的选择等(请参阅here以获取我给出的演讲摘要在我接受采访的同一会议上的主题,以及幻灯片“PDF”的链接。

答案 1 :(得分:3)

“拼写错误”以外的错误。如果你没有测试某些东西,那么知道发现拼写错误的变量名称的东西无论如何都不能保证你。

答案 2 :(得分:3)

某些编辑器(例如,NetBeans)会分析您的代码并为“可疑”部分加下划线,例如未使用的变量,这可能是拼写错误的标志。 NB还会在屏幕的其他位置突出显示光标上方的标识符,这也有帮助。

当然,没有聪明的IDE技巧可以取代正确的测试。

答案 3 :(得分:1)

TDD - 首先编写测试,然后编写最简单的代码以通过测试。这样你就可以更加确定你没有任何未经测试的代码。这有助于确保代码中的拼写错误或其他错误更少。

结对编程/代码审查 - 两双眼睛比一对眼睛好。

具有智能感知的IDE - 不是灵丹妙药,但在不拼写错误方面有很大帮助。如果使用intellisense,通常会出现替换错误,而不是拼写错误。通过测试不难发现这些。

答案 4 :(得分:1)

在ruby中,拼写错误的局部变量会导致程序死亡,这很好。

拼写错误的实例变量不会导致程序死得很厉害,这很糟糕。要检测此类案例,use warnings。不幸的是,你不能轻易地告诉ruby treat warnings as errors

答案 5 :(得分:1)

就我而言,我广泛使用单元测试(用Python开发)。因为有很多轻量级的测试框架很好地集成到语言中(如果你愿意,还可以使用IDE),使用它们会让你几乎不会感到痛苦;)

看看这个例子:

def unpack_args(func):
    def deco_func(*args):
        if isinstance(args, tuple):
            args = args[0]

        return func(*args)

    return deco_func


def func1(*args):
    """
    >>> func1(1,2,3)
    (1, 2, 3)
    >>> func1(*func2(1,2,3))
    (1, 2, 3)
    >>> func1(func2(1,2,3))
    ((1, 2, 3),)
    """
    return args

def func2(*args):
    """
    >>> func2(1,2,3)
    (1, 2, 3)
    """
    return args

@unpack_args
def func3(*args):
    return args


def test():
    """
    >>> func3(func2(1,2,3))
    (1, 2, 3)
    """
    import doctest
    doctest.testmod(verbose=True)


test()

    -----------------------------
    Results: 

Trying:
    func1(1,2,3)
Expecting:
    (1, 2, 3)
ok
Trying:
    func1(*func2(1,2,3))
Expecting:
    (1, 2, 3)
ok
Trying:
    func1(func2(1,2,3))
Expecting:
    ((1, 2, 3),)
ok
Trying:
    func2(1,2,3)
Expecting:
    (1, 2, 3)
ok
Trying:
    func3(func2(1,2,3))
Expecting:
    (1, 2, 3)
ok
3 items had no tests:
    __main__
    __main__.func3
    __main__.unpack_args
3 items passed all tests:
   3 tests in __main__.func1
   1 tests in __main__.func2
   1 tests in __main__.test
5 tests in 6 items.
5 passed and 0 failed.
Test passed.

答案 6 :(得分:1)

我认为'拼写'你的意思是错误输入变量/函数/类名。这在Python中比在Perl中少一个问题,因为默认情况下Perl(我相信Ruby)会自动创建一个变量并在第一次使用时将其初始化为零或“”。 Python没有这样做,因为使用尚未显式创建的变量是一个错误,所以从这个意义上说它已经处于'严格'模式。

我将Vim与pyflakes插件一起使用,一旦您输入它就会突出显示大多数类型的拼写错误。我也经常使用pylint和pychecker,因为它们可以捕获许多其他类型的错误。

我做的另一件事是大量使用Vim的自动完成 - 我只输入一次完整的名字,然后在名字的后续使用中输入前几个字母并使用 <ctrl-n> <ctrl-p> 循环比赛。

我还使用测试驱动开发,目标是100%单元测试覆盖率。

我发现所有这些实践的结合意味着由错别字引起的问题几乎不存在。

答案 7 :(得分:0)

许多单元测试工具可以显示他们测试的行数百分比。这个百分比越接近100%,变量名称拼写就越不可能。

答案 8 :(得分:0)

在Groovy中,构成程序的抽象语法树(AST)随时可用。因此可以编写检查AST的工具,并针对可能出错的事情发出警告。

例如,如果您尝试调用在编译时不存在的方法,GroovyLint将警告您,但是非常接近存在的方法。

示例:

class Test{
    static def foobar(){ return 5; }
}

Test.fooBar() //Here GroovyLint suggests calling foobar instead of fooBar.

答案 9 :(得分:-1)

我在eclipse IDE中编写了所有Python代码。正如MladenJablanović所暗示的那样,eclipse强调了可疑部分。

下一步是运行代码。现在我可能面临两种错误。

  1. 解释器捕获的错误并给我一个行号:这些通常很容易调试,特别是如果你在该行之前打印该行中的所有变量,以确保它们包含值你期望的那样。

  2. 意外行为:您的代码很好,解释器不会抱怨,但您的代码行为不符合您的要求。当这种情况发生时(很少,因为我通常很好地设计我的模块 - 一个大约需要7分钟的过程 - 在我开始编码之前)我开始按照它们被调用的顺序查看模块/函数并尝试执行程序我的头像翻译一样会看到它。如果这不起作用,那么我继续探索调试器。通常情况下,它并没有归结为这一点,但如果确实如此,这是一个相当大的bug,它需要相当长的时间来修复。单元测试有帮助,但坦率地说,我认为作为一名计算机科学家,我应该能够从算法分析的角度进行调试,这通常比单元测试更快(至少对我而言)。另外,选择对单元测试进行算法分析可以锻炼我的大脑,这样我就不会在将来犯这样的错误,而不是单元测试,这有助于我现在解决问题,但在帮助方面做得不多我避免在将来犯同样/类似的错误。

  3. 希望这有帮助