String Go中具有巨大字符串长度的单元测试覆盖率?

String Go中具有巨大字符串长度的单元测试覆盖率?,string,unit-testing,go,code-coverage,String,Unit Testing,Go,Code Coverage,在某些代码中,我有一个测试,确保字符串长度小于2^32。但是它很难测试,因为生成一个更大的字符串进行测试可能会导致测试程序崩溃,并出现内存不足错误 我如何才能实现100%的测试覆盖率,但为了安全起见仍在测试这种情况?重构代码,将测试可以更改的限制移到函数之外: var limit = 1 << 32 var ErrTooLarge = errors.New("String is too large!") func Process(s string) error { if

在某些代码中,我有一个测试,确保字符串长度小于
2^32
。但是它很难测试,因为生成一个更大的字符串进行测试可能会导致测试程序崩溃,并出现内存不足错误


我如何才能实现100%的测试覆盖率,但为了安全起见仍在测试这种情况?

重构代码,将测试可以更改的限制移到函数之外:

var limit = 1 << 32

var ErrTooLarge = errors.New("String is too large!")

func Process(s string) error {
    if len(s) > limit {
        return ErrTooLarge
    }
    // All OK
    return nil
}
正在运行“go测试-封面”:

PASS
coverage: 100.0% of statements
ok      play    0.001s

重构代码,将测试可以更改的限制移到函数之外:

var limit = 1 << 32

var ErrTooLarge = errors.New("String is too large!")

func Process(s string) error {
    if len(s) > limit {
        return ErrTooLarge
    }
    // All OK
    return nil
}
正在运行“go测试-封面”:

PASS
coverage: 100.0% of statements
ok      play    0.001s

杰出的我没想到。我的极限是一个常数。你一看就明白了,太好了。我没想到。我的极限是一个常数。我会注意到,Go中很少有项目会尝试保持100%的测试覆盖率,因为这不是一个有用的指标。你最终会得到无用的甚至是坏掉的测试,这些测试只是为了覆盖率,它常常迫使你笨拙地重构一些代码来运行测试。也可以在不测试所有内容的情况下实现100%的覆盖率。我现在明白你的意思了。当测试标准lib函数返回的错误代码时,问题就会出现。我要指出的是,Go中很少有项目试图保持100%的测试覆盖率,因为这不是一个有用的指标。你最终会得到无用的甚至是坏掉的测试,这些测试只是为了覆盖率,它常常迫使你笨拙地重构一些代码来运行测试。也可以在不测试所有内容的情况下实现100%的覆盖率。我现在明白你的意思了。当测试标准lib函数返回的错误代码时,问题就会出现。很难诱导返回错误代码。