验证格式化的消息

时间:2019-10-18 17:30:56

标签: python python-3.x unit-testing

我正在编写对输入进行一些分析并返回结果的软件。需求的一部分包括它生成零个或多个警告或错误,并包括结果。我也在编写单元测试,尤其是其中包含一些人为设计的数据,以验证是否发出了正确的警告。

我需要能够解析警告/错误并验证是否正确发出了预期的消息。我认为我会将消息存储在容器中,并使用消息ID引用它们,这与我过去进行本地化的方式非常相似。

errormessages.py现在看起来非常类似于:

from enum import IntEnum
NO_MESSAGE = ('')
HELLO = ('Hello, World')
GOODBYE = ('Goodbye')

class MsgId(IntEnum):
    NO_MESSAGE = 0
    HELLO = 1
    GOODBYE = 2

Msg = {
    MessageId.NO_MESSAGE: NO_MESSAGE,
    MessageId.HELLO: HELLO,
    MessageId.GOODBYE: GOODBYE,
}

因此,分析看起来可能与此类似:

from errormessages import Msg, MsgId
def analyse(_):
    errors = []
    errors.append(Msg[MsgId.HELLO])
    return _, errors

在单元测试中,我可以做类似的事情

from errormessages import Msg, MsgId
from my import analyse
def test_hello():
    _, errors = analyse('toy')
    assert Msg[MsgId.HELLO] in errors

但是有些消息被格式化了,我认为解析这些消息以进行单元测试会变得很麻烦。我当时想添加一些消息的味道;一个用于格式化,另一个用于解析:

更新了errormessages.py

from enum import IntEnum
import re
FORMAT_NO_MESSAGE = ('')
FORMAT_HELLO = ('Hello, {}')
FORMAT_GOODBYE = ('Goodbye')

PARSE_NO_MESSAGE = re.compile(r'^$')
PARSE_HELLO = re.compile(r'^Hello, (.*)$')
PARSE_GOODBYE = re.compile('^Goodbye$')

class MsgId(IntEnum):
    NO_MESSAGE = 0
    HELLO = 1
    GOODBYE = 2

Msg = {
    MessageId.NO_MESSAGE: (FORMAT_NO_MESSAGE, PARSE_NO_MESSAGE),
    MessageId.HELLO: (FORMAT_HELLO, PARSE_HELLO),
    MessageId.GOODBYE: (FORMAT_GOODBYE, PARSE_GOODBYE),
}

因此分析可以像这样:

from errormessages import Msg, MsgId
def analyse(_):
    errors = []
    errors.append(Msg[MsgId.HELLO][0].format('World'))
    return _, errors

在单元测试中,我可以做到:

from errormessages import Msg, MsgId
from my import analyse
import re
def test_hello():
    _, errors = analyse('toy')
    expected = {v: [] for v in MsgId}
    expected[MsgId.HELLO] = [
        Msg[MsgId.HELLO][1].match(msg)
        for msg in errors
    ]
    for _,v in expected.items():
        if _ == MsgId.HELLO:
            assert v
        else:
            assert not v

我想知道是否有更好/更简单的方法?特别是,消息有效地重复了两次;一次用于格式化程序,一次用于正则表达式。是否可以使用单个字符串进行格式设置和正则表达式捕获?

1 个答案:

答案 0 :(得分:1)

假设所有邮件都存储为格式字符串模板(例如class KeyBinds { public delegate void Del(object sender, EventArgs e); public static void CheckKey(int key) { Del handler = (Application.OpenForms[0] as Main).playbutton_Click; (Application.OpenForms[0] as Main).Invoke(handler(null,null)); } "Hello""Hello, {}"),则可以直接从模板生成正则表达式:

"Hello, {firstname} {surname}"