Python unittest TypeError - PullRequest
       19

Python unittest TypeError

1 голос
/ 13 марта 2019

Пытаюсь построить юнит-тест в Python, но я получаю эту ошибку TypeError, где говорится, что она пропускает необходимый потенциальный аргумент. Я перепробовал все и в итоге получил следующий код:

import unittest
from MyCosine import CosineSim, CosineDis

class TestMyCosine(unittest.TestCase):

    x = [3.5 , 3 , 3.5 , 2.5 , 3]
    y = [3.5 , 3 , 4 , 2.5 , 4.5]
    result = 0.9865867

    def testCosineSim(self, result, x, y):
        self.x = x
        self.y = y
        self.result = result
        self.assertEqual(CosineSim(x,y), result, "0.9865867" )

    def testCosineDis(self, result, x, y):
        self.x = x
        self.y = y
        self.result = result
        self.assertEqual(CosineDis(x,y) , result, "0.9865867")


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

и это сообщение об ошибке:

======================================================================
ERROR: testCosineDis (__main__.TestMyCosine)
----------------------------------------------------------------------
TypeError: testCosineDis() missing 3 required positional arguments:     'result', 'x', and 'y'

======================================================================
ERROR: testCosineSim (__main__.TestMyCosine)
----------------------------------------------------------------------
TypeError: testCosineSim() missing 3 required positional arguments: 'result', 'x', and 'y'

----------------------------------------------------------------------
Ran 2 tests in 0.000s

FAILED (errors=2)

Это одна из актуальных функций:

def CosineDis(x,y):
    result = 1 - distance.cosine(x, y)
    return result

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Область, в которой вы определяете x и где вы использовали x в качестве входного аргумента, не совпадает. Поскольку вы, похоже, хотите использовать статические значения для x, y и result, мы можем просто поместить их в setUp(), который модульный тест обнаружит и запустит до вызова любого метода тестирования.

Быстрое редактирование на телефоне (не проверял):

import unittest
from MyCosine import CosineSim, CosineDis

class TestMyCosine(unittest.TestCase):
    def setUp(self) :
        self.x = [3.5 , 3 , 3.5 , 2.5 , 3]
        self.y = [3.5 , 3 , 4 , 2.5 , 4.5]
        self.result = 0.9865867

    def testCosineSim(self):
        self.assertEqual(CosineSim(self.x,self.y), self.result, "0.9865867" )

    def testCosineDis(self):
        self.assertEqual(CosineDis(self.x,self.y) , self.result, "0.9865867")


if __name__ == '__main__':
    unittest.main(exit=False)
1 голос
/ 13 марта 2019

Это потому, что созданная вами переменная будет автоматически передана в TestCase.Одним из решений является передача параметров вручную.Или вы можете использовать решение типа параметризованное для этого:

from parameterized import parameterized

class TestSequence(unittest.TestCase):
    @parameterized.expand([
        [0.9865867, 3.5, 3.5],
        [0.9865867, 3, 3],
    ])
    def testCosineSim(self, result, x, y):
        self.assertEqual(CosineSim(x,y), result)
...