DataBricks Python 需要单元测试错误帮助

DataBricks Python unit test error help needed

我在 DataBricks 中进行单元测试时遇到问题。我还没有发现任何类似的错误信息。有人可以帮我吗?

下面你可以找到我的代码:

import unittest

def add(n1, n2):
  a = n1+n2
 
  return a

class addTest(unittest.TestCase):
  
  def test_add(self):
    self.assertEqual(add(5,5), 10)

unittest.main()

错误信息是这样的:

EEEEEEEE
======================================================================
ERROR: 36941 (unittest.loader._FailedTest)
----------------------------------------------------------------------
AttributeError: module '__main__' has no attribute '36941'

======================================================================
ERROR: 0 (unittest.loader._FailedTest)
----------------------------------------------------------------------
AttributeError: module '__main__' has no attribute '0'

======================================================================
ERROR: 50000 (unittest.loader._FailedTest)
----------------------------------------------------------------------
AttributeError: module '__main__' has no attribute '50000'

======================================================================
ERROR: 923 (unittest.loader._FailedTest)
----------------------------------------------------------------------
AttributeError: module '__main__' has no attribute '923'

======================================================================
ERROR: dcc9864f9b334f05b20e25d63062f770 (unittest.loader._FailedTest)
----------------------------------------------------------------------
AttributeError: module '__main__' has no attribute 'dcc9864f9b334f05b20e25d63062f770'

======================================================================
ERROR: 3 (unittest.loader._FailedTest)
----------------------------------------------------------------------
AttributeError: module '__main__' has no attribute '3'

======================================================================
ERROR: 4b8784f2c9e2dd8ccd5890b026495bf12fc0671c88baa508721606e240ca39b2 (unittest.loader._FailedTest)
----------------------------------------------------------------------
AttributeError: module '__main__' has no attribute '4b8784f2c9e2dd8ccd5890b026495bf12fc0671c88baa508721606e240ca39b2'

======================================================================
ERROR: unpinned (unittest.loader._FailedTest)
----------------------------------------------------------------------
AttributeError: module '__main__' has no attribute 'unpinned'

有人可以帮助我吗?谢谢!

unittest.main 包在使用 Databricks 时需要特殊处理。使用 Databricks 的主要要求是在 unittest.main 函数的参数列表中设置 exit = False。将 argv 作为单元素列表显式传递也是有意义的,以避免使用 Databricks 上包含用于启动 Python 子进程的参数的 sys.argv。 (参见 documentation on unittest.main)。

但它也可能无法按预期工作。我通常通过自己进行自动发现并执行它来生成测试套件。例如使用以下代码:

import unittest

def discover_test_cases(*test_classes):
  suite = unittest.TestSuite()
  for test_class in test_classes:
    for test in unittest.defaultTestLoader.getTestCaseNames(test_class):
      suite.addTest(test_class(test))
      
  return suite

def discover_test_classes():
  classes = [obj for name, obj in globals().items()
    if name.endswith('Test') and 
       obj.__module__ == '__main__' and 
       isinstance(obj, type) and 
       unittest.case.TestCase in set(obj.__bases__)]

  return discover_test_cases(*classes)

它被用作:

suite = discover_test_classes()
runner = unittest.TextTestRunner()
results = runner.run(suite)

(您也可以使用 unittest-xml-reporting 包,然后您可以获得 JUnit XML 格式的测试结果,可以集成到构建过程中)

P.S。还有 nutter library from the Microsoft - it's designed specifically for notebooks testing. It has some advantages, like, automatic discovery of tests, generation of results as JUnit XML, etc. I have an example 将它与 Databricks Repos 功能一起使用。

我正在使用以下代码

我遇到了同样的问题,多亏了两篇文章(请参阅下面的源代码),我才得以解决。但是,最重要的部分是您可以在 DATABRICKS notebook 中执行的可重现示例(它对我有用,我有 python 3.7):

import unittest

class SayHiAndBye():
    def say_hello(self,name):
      return f"Hello {name}"
    def say_bye(self,name):
      return f"Bye {name}"

class MyNotebookTesting(unittest.TestCase):
    """
    You can test whaatever you want in here
    """
    
    def test_hello(self):
        sayHiBye = SayHiAndBye()
        actual_output = sayHiBye.say_hello("Bratt")
        expected_ouput = "Hello Bratt"
        self.assertEqual(actual_output, expected_ouput)

    def test_bye(self):
        sayHiBye = SayHiAndBye()
        actual_output = sayHiBye.say_bye("Bratt")
        expected_ouput = "Bye Bratt"
        self.assertEqual(actual_output, expected_ouput)

        
suite = unittest.TestLoader().loadTestsFromTestCase(MyNotebookTesting)
runner = unittest.TextTestRunner(verbosity=100)
results = runner.run(suite)
print(results)

如您所见,它会告诉您 test_string 失败,但 test_boolean 可以。 这些值仅针对示例进行了硬编码(请随意更改它们并查看输出结果)。

来源:

https://www.linuxtut.com/en/cd2a861b29e00448fc0f/

https://www.journaldev.com/15899/python-unittest-unit-test-example