В Python, как вы программно выполняете модульные тесты, хранящиеся в строке? - PullRequest
5 голосов
/ 30 января 2010

Следующий код используется для выполнения тестов в приложении Google App Engine. Как бы вы сделали это для тестов, написанных как утверждения модульного теста, а не как doctests?

#The solution and tests are untrusted code passed in to the GAE app. 
solution = 'b=5'
unittest = 'assertEqual(b, 5)'

#Here is the doctest version as a reference. 
solution = 'b=5'
doctest = '>>> b \n 5'

#Compile and exec the untrusted solution provided by the user. 
compiled = compile(solution, 'submitted code', 'exec')
sandbox = {}
exec compiled in sandbox

#Compile and exec each of the doctests
test_cases = doctest.DocTestParser().get_examples(doctest)
  for test in test_cases:
    if not test.want:
      exec test.source in sandbox

1 Ответ

3 голосов
/ 30 января 2010

Методы класса, такие как unittest.TestCase.assertEqual, не выполняются вне контекста, предоставленного экземпляром этого класса. Итак, строка типа вашего 'assertEqual(b, 5)' на самом деле очень, ОЧЕНЬ плохой случай - обратите внимание, что записанная строка не будет никогда выполняться должным образом (вам нужно, по крайней мере, предварительно добавить нечто вроде 'self.', а затем self необходимо превратить в экземпляр класса и т. д. и т. д.).

Я не совсем уверен, почему вы хотите поддерживать такие катастрофические конструкции, но, если вы непреклонны, что вы делаете любой ценой, то это общая идея: сделать экземпляр класса unittest.Testcase, добавьте к этой строке имя ссылки на экземпляр и точку и выполните эту составную строку. Затем, конечно, вы попадаете во всевозможные другие забавные требования, такие как перехват исключений, которые могут быть повышены (поскольку у вас на самом деле нет тестового бегуна, который бы выполнял все такие вспомогательные задачи за вас). Yecch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...