我使用 VSCode 中集成的 Python unittest 进行测试。我有这样的目录
project_root/
src/
module/
__init__.py
a.py
test/
module/
__init__.py
test_a.py
Run Code Online (Sandbox Code Playgroud)
有test_a.py进口from module.a import SomeClass
我有参数
"-v",
"-s",
"./test",
"-p",
"test*.py"
Run Code Online (Sandbox Code Playgroud)
当运行测试发现时,它失败并引发ModuleNotFound或Can not import模块或类a.py
PS:我已经设置了PYTHONPATH,settings.json代码分析和程序启动都工作正常。但似乎对插件没有帮助unittest。一个问题是,两个src,test都有命名的模块module,我不确定这是否重要。
如何让它发挥作用?
更新:似乎这是一个名称冲突问题,unittest_discovery 无法处理此问题。在我更改 args 后,-s ./test/module它可以导入 src 模块。
我刚刚在单元测试中添加了一个图形实用程序——基本上,测试的全自动版本只是进行数值比较,但我希望人们能够要求绘图。
如果我使用我的新参数,仅仅使用 argparseunittest.main()就会令人窒息。我目前正在做的是检查该参数,然后从中删除它sys.argv似乎是错误的。
有没有更好的方法给这只猫剥皮?
unittest.main()会采用备用 argv。unittest.main()忽略争论的方法。if __name__ == '__main__':
parser = argparse.ArgumentParser(
description='Test correction'
)
parser.add_argument(
'--plot-results',
help='Plot results of cal test',
action='store_true'
)
args = parser.parse_args()
if args.plot_results:
while '--plot-results' in sys.argv:
sys.argv.remove('--plot-results')
unittest.main()
Run Code Online (Sandbox Code Playgroud) 我正在尝试测试一个根据给定参数为我处理工作目录的类。为此,我们使用类变量来映射它们。
当传递特定值时,将从环境变量中检索路径(请参见baz下面的示例)。这是我正在尝试测试的具体案例。
我正在使用 Python3.8.13和unittest.
WorkingDirectory.map字典,因为我想确保我们从environ特定变量(BAZ_PATH)中获取。os.environ["baz"] = DUMMY_BAZ_PATH我尝试按照其他出版物中的建议将其模拟environ为字典,但由于某种原因我无法使其工作。
# working_directory.py
import os
class WorkingDirectory:
map = {
"foo": "path/to/foo",
"bar": "path/to/bar",
"baz": os.environ.get("BAZ_PATH"),
}
def __init__(self, env: str):
self.env = env
self.path = self.map[self.env]
@property
def data_dir(self):
return os.path.join(self.path, "data")
# Other similar methods...
Run Code Online (Sandbox Code Playgroud)
测试文件:
# test.py
import os
import unittest
from unittest import mock
from working_directory import WorkingDirectory
DUMMY_BAZ_PATH = "path/to/baz" …Run Code Online (Sandbox Code Playgroud) 我有两个具有相同问题的测试方法,这里是主类中的原始方法:
def get_num_words(self, word_part):
""" 1 as default, may want 0 as an invalid case """
if word_part[3] == '0a':
self.num_words = 10
else:
self.num_words = int(word_part[3])
return self.num_words
def get_num_pointers(self, before_at):
self.num_pointers = int(before_at.split()[-1])
return self.num_pointers
Run Code Online (Sandbox Code Playgroud)
以下是两个测试类:
def test_get_num_words(self):
word_part = ['13797906', '23', 'n', '04', 'flood', '0', 'inundation', '0', 'deluge', '0', 'torrent', '0', '005', '@', '13796604', 'n', '0000', '+', '00603894', 'a', '0401', '+', '00753137', 'v', '0302', '+', '01527311', 'v', '0203', '+', '02361703', 'v', '0101', '|', 'an', 'overwhelming', 'number', 'or', …Run Code Online (Sandbox Code Playgroud) 我有一个如下的小代码,请帮助我以正确的方式写这个.我想检查ID是否存在value,如果不存在则会引发异常.
value = ({'av' : '123', 'user' : 'abc', 'version' : 'xyz'})
with self.assertRaises(IndexError, value[0]["ID"]):
print "not an error"
Run Code Online (Sandbox Code Playgroud) 说我有这样的测试:
self.assertTrue( car.color == 'blue')
Run Code Online (Sandbox Code Playgroud)
我用它来运行它
nosetests test_car.py -x -v --stop
Run Code Online (Sandbox Code Playgroud)
如果失败了,我希望打印出car.color的实际值.有没有办法做到这一点?
有没有办法在Python中知道从单元测试执行或调试运行的上下文调用函数?
对于上下文,我正在尝试对使用执行数据库调用的函数的代码进行单元测试.为了避免在测试该函数期间进行数据库调用(DB调用单独测试),我试图让DB IO函数知道它们的环境,并模拟在单元测试中调用它们并在调试期间记录其他变量跑.
我目前的方法是读取/写入环境变量,但它似乎有点过分,我认为Python必须有更好的机制.
编辑: 以下是我尝试进行单元测试的函数示例:
from Database_IO import Database_read
def some_function(significance_level, time_range)
data = Database_read(time_range)
significant_data = data > significance_level
return significant_data
Run Code Online (Sandbox Code Playgroud) 我的测试很简单。我想向两个不同的服务器发送两个请求,然后比较结果是否匹配。
我要测试以下内容。
I do not want to send the requests in setUp method because it will be send over and over for each new test. I would rather want to send the requests at the initialization. (maybe in the init method). But I found a lot of people were against that idea because they believe I should not override the init method for some reason. (I do not know exactly why) If that's the case, where should I …
我正在使用unittest模块在python中创建一个测试用例。
我确实创建了一个我想从用户那里得到的解析参数列表。但是,当我在执行python脚本时使用该参数时,它给出了错误:“ option -i无法识别用法:testing.py [options] [test] [...]”
代码段:
class Testclass(unittest.TestCase):
@classmethod
def setUpClass(cls):
print "Hello Class"
def test_addnum(self):
print "Execute the test case"
#parser = parse_args(['-i'])
print 'simple_value =', args.inputfile
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument('-i', help='input file', dest='inputfile')
ns, args = parser.parse_known_args(namespace=unittest)
#args = parser.parse_args()
return ns, sys.argv[:1] + args
if __name__ == '__main__':
unittest.main()
Run Code Online (Sandbox Code Playgroud)
执行上面的脚本时出现的错误m -i somefile.txt是:
option -i not recognized
Usage: testing.py [options] [test] [...]
Options:
-h, --help Show this message
-v, --verbose Verbose output
-q, …Run Code Online (Sandbox Code Playgroud) Python 2.7和3.4:为什么test_unexpected_error测试会抛出错误而不是失败?
import unittest
class TestLists(unittest.TestCase):
def test_unexpected_error(self):
self.assertEqual([0] * 1000 + [1], [1] + [0] * 1000)
def test_fails_as_expected(self):
self.assertEqual([0] * 1000 + [1], [0] * 1000 + [0])
if __name__ == '__main__':
unittest.main()
Run Code Online (Sandbox Code Playgroud)
错误是:
RuntimeError: maximum recursion depth exceeded while calling a Python object
Run Code Online (Sandbox Code Playgroud)
回溯(删节 - 递归错误是一个递归错误是一个递归错误是....)
Traceback (most recent call last):
File "sotest.py", line 7, in test_unexpected_error
self.assertEquals([0] * 1000 + [1], [1] + [0] * 1000)
File "/usr/lib/python2.7/unittest/case.py", line 513, in assertEqual
assertion_func(first, second, …Run Code Online (Sandbox Code Playgroud)