使单元测试失败导致 Google 云构建中的构建失败
Make unittest failures cause build failure in Google Cloud build
我正在 Google Cloud Platform 上的 Python 项目 运行ning 上设置 CI/CD。代码部署工作正常,但我还为单独的功能创建了一些单元测试。这些单元测试位于几个不同的文件中,因此我创建了一个新文件,其中包含所有这些单元测试并将它们添加到测试套件中。例如,我有一个名为 testFunction1.py
的文件,如下所示:
from main import Function1
class TransformTests(unittest.TestCase):
def test_function(self):
# Test goes here
if __name__ == '__main__':
logging.getLogger().setLevel(logging.ERROR)
unittest.main()
然后我有一个名为 testFunction2.py
的类似文件用于不同的功能。
最后我有一个名为 executeTests.py
的文件,如下所示:
import unittest
testmodules = [
'testFunction1',
'testFunction2'
]
suite = unittest.TestSuite()
loader = unittest.TestLoader()
for t in testmodules:
mod = __import__(t, globals(), locals(), ['suite'])
suite.addTests(loader.loadTestsFromModule(mod))
unittest.TextTestRunner().run(suite)
现在我运行使用这个文件来一次执行所有测试,这也很有效。我的问题是 运行 这个文件在 Google Cloud Build 中。我的 cloudbuild.yaml 文件结构如下:
steps:
- name: "docker.io/library/python:3.7"
args: ["pip3", "install", "-t", "/workspace/lib", "-r", "requirements.txt"]
- name: "docker.io/library/python:3.7"
args: ["python3", "executeTests.py"]
env: ["PYTHONPATH=/workspace/lib"]
这工作正常,但如果测试失败,云构建仍然通过,这当然不是我想要的。
有谁知道如何更改此设置,以便在测试失败时云构建失败?这也是一个简单的例子,在真实的 repo 中我有大约 50 个测试文件,所以我不想将它们每个都添加到 cloudbuild.yaml 文件中。
如果 return 代码为 0,Cloud Build 认为步骤成功。否则,构建失败。
因此,在您的测试代码中,当至少一个测试失败时执行 exit(1)
。构建将停止。
感谢 ,我通过将 executeTests.py
文件中的最后一行代码替换为以下代码解决了这个问题:
ret = not unittest.TextTestRunner().run(suite).wasSuccessful()
sys.exit(ret)
我正在 Google Cloud Platform 上的 Python 项目 运行ning 上设置 CI/CD。代码部署工作正常,但我还为单独的功能创建了一些单元测试。这些单元测试位于几个不同的文件中,因此我创建了一个新文件,其中包含所有这些单元测试并将它们添加到测试套件中。例如,我有一个名为 testFunction1.py
的文件,如下所示:
from main import Function1
class TransformTests(unittest.TestCase):
def test_function(self):
# Test goes here
if __name__ == '__main__':
logging.getLogger().setLevel(logging.ERROR)
unittest.main()
然后我有一个名为 testFunction2.py
的类似文件用于不同的功能。
最后我有一个名为 executeTests.py
的文件,如下所示:
import unittest
testmodules = [
'testFunction1',
'testFunction2'
]
suite = unittest.TestSuite()
loader = unittest.TestLoader()
for t in testmodules:
mod = __import__(t, globals(), locals(), ['suite'])
suite.addTests(loader.loadTestsFromModule(mod))
unittest.TextTestRunner().run(suite)
现在我运行使用这个文件来一次执行所有测试,这也很有效。我的问题是 运行 这个文件在 Google Cloud Build 中。我的 cloudbuild.yaml 文件结构如下:
steps:
- name: "docker.io/library/python:3.7"
args: ["pip3", "install", "-t", "/workspace/lib", "-r", "requirements.txt"]
- name: "docker.io/library/python:3.7"
args: ["python3", "executeTests.py"]
env: ["PYTHONPATH=/workspace/lib"]
这工作正常,但如果测试失败,云构建仍然通过,这当然不是我想要的。
有谁知道如何更改此设置,以便在测试失败时云构建失败?这也是一个简单的例子,在真实的 repo 中我有大约 50 个测试文件,所以我不想将它们每个都添加到 cloudbuild.yaml 文件中。
如果 return 代码为 0,Cloud Build 认为步骤成功。否则,构建失败。
因此,在您的测试代码中,当至少一个测试失败时执行 exit(1)
。构建将停止。
感谢 executeTests.py
文件中的最后一行代码替换为以下代码解决了这个问题:
ret = not unittest.TextTestRunner().run(suite).wasSuccessful()
sys.exit(ret)