【问题标题】:Testing the python code using non-ascii characters使用非 ascii 字符测试 python 代码
【发布时间】:2019-08-22 07:27:38
【问题描述】:

我们正在努力将 Python 2 代码迁移到 Python 2&3 兼容代码。

我们在迁移过程中使用 futurize。

好吧,众所周知,在 Python 2&3 兼容性中存在很多 Unicode 和字节字符串问题。目前,我们只测试了简单英文字符(ASCII字符)的代码

我们如何对这些方法进行单元/功能测试,以检查在提供非 ASCII 字符作为输入时它不会中断?

def any_random_method(some_string):
    # Some code
    return some_return_string

我应该如何使用非 ASCII 字符对此进行单元测试。?一个代码 sn-p 会很有帮助。

p.s 我很困惑如何专门提供非 ascii 字符来启动单元测试。并且...我想用 Python 2 和 Python 3 对它进行单元测试。所以单元测试应该支持这两个版本来在测试时处理非ASCII字符

编辑

  • 测试具有多个 ascii 和非 ascii 字符的方法的一般做法是什么?

【问题讨论】:

  • unicode 对你有用吗?
  • 你能详细说明一下这个问题吗?一点说明:该方法可以与其他端点以及 Python 的内置函数进行交互。因此,它可以同时包含字节和 Unicode。我们确保首先将每个字节字符串转换为 Unicode。最后,在输出时,我们确保它被编码为字节。如果您需要更多说明,请告诉我
  • 你的方法参数的类型是什么,只有字符串?
  • 不,我刚刚放了一个样本 sn-p。目标是测试任何使用字符串的方法。我可以将字符串作为参数传递,甚至可以模拟对象。问题在于如何在这些方法中提供非 ascii 字符。为了简化,假设我们有字符串参数并且想要测试。

标签: python


【解决方案1】:

你可以使用:

# -*- coding: utf-8 -*-
import unittest


def func1(my_string):
    # your code
    pass


def func2(my_string):
    pass


class TestNotBreakFunctions(unittest.TestCase):

    def setUp(self):
        self.string_utf8 = 'Όταν λείπει η γάτα, χορεύουν τα ποντίκια.'

    def test_func1(self):
        try:
            func1(self.string_utf8)
        except Exception as e:
            self.assertTrue(False, e)

    def test_func2(self):
        try:
            func2(self.string_utf8)
        except Exception as e:
            self.assertTrue(False, e)


if __name__ == '__main__':
    unittest.main()

该示例基于您有一个 str 类型的参数的假设,但您可以使用任何类型的参数,只需使用 try except

【讨论】:

  • 它在 Python 2.7 中给了我一个语法错误。 SyntaxError: Non-ASCII character '\xce' in file try.py on line 16, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details。这实际上是我被卡住的地方。请让我知道如何在 Python2 中使用它。谢谢,
  • @JayJoshi 只需将 # -- coding: utf-8 -- 添加到您的第一行,我会更新我的答案
  • 它确实解决了错误。您能否建议一下,您是如何决定使用您提到的字符串 string_utf8 的?我应该提供哪些不同的字符串。?从哪里可以找到字符列表。?而且,一般的测试实践是什么?谢谢。
  • 为了有一个容易获取的 utf8 字符串(不仅仅是 ASCII 字符)你可以从有特殊字符的语言中选择一些句子,在这个例子中我选择了希腊语,你也可以选择法语、德语、俄语等
  • 执行您的测试
【解决方案2】:

从上述解决方案中借用字符串: 取一个非 ascii 字符串:'Όταν λείπει η γάτα, χορεύουν τα ποντίκια。'

  1. 在 python-2 代码中获取 function_abc 的输出:假设是“xyz”
  2. make unitTest 解释如上。
  3. 在 python 3 上运行 unitTest
  4. 检查函数的输出是否与 python-2 代码中的相同

类TestNotBreakFunctions(unittest.TestCase):

def setUp(self):
    self.string_utf8 = 'Όταν λείπει η γάτα, χορεύουν τα ποντίκια.'

def test_abc(self):
    result= function_abc(self.string_utf8)
    self.assertEqual("xyz",result)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多