У меня возникают проблемы при попытке запустить код Jython, встроенный в скомпилированное приложение Groovy.Тот же самый jython-код отлично работает, когда он встроен в java-приложение (The Grinder 3.1)
В коде groovy я использую класс org.python.util.PythonInterpreter (из jython 2.2.1) для созданиявызываемый экземпляр класса TestRunner (это требование The Grinder).
Пример иллюстративного кода Jython:
class TestRunner:
def __init__(self):
doinitstuff()
def __call__():
a = A()
a.work()
class A:
def __init__(self):
self.b = B()
def work(self):
print "Calling methodcall"
self.b.methodcall()
class B:
def __init__(self):
self.webservice = WebServiceStubImplementedInJava()
print str(self.webservice)
def methodcall(self):
print "In methodcall"
try:
return self.webservice.soapmethod()
except:
log_error()
raise
Вот вывод, когда я запускаю приведенный выше код:
- Метод TestRunners
__call__()
вызовет метод work()
экземпляра класса A, и будет выведен вывод toString заглушки веб-службы. - Напечатано сообщение «Calling methodcall».
- Сообщение «In methodcall» никогда не печатается, и вместо этого я получаю:
AttributeError: 'javainstance' object has no attribute '__call__'
.Трассировка стека заканчивается на self.b.methodcall()
Есть ли у вас какие-либо идеи, почему вызов self.b.methodcall()
должен привести к AttributeError: 'javainstance' object has no attribute __call__
Добавление некоторого контекста к проблеме ...
- Я пытаюсь использовать класс Groovy для выполнения работы, которую рабочий поток Grinder будет выполнять при тестировании производительности нашего продукта.
- Я использую groovy только ради "менее подробного кода", но, возможно, придется переключиться на обычную старую Java, если она вызывает groovy.
- Причина для этого заключается в том, что мне нужно выяснить, какие файлы на самом деле используются Grinder для данного тестового сценария.
- У нас есть сотни
*.py
файлов, файлов конфигурации и т. Д., Но только подмножество их используется для одного конкретного тестового сценария.Все они используются в некоторых тестовых сценариях. - Это делает довольно трудным для "новичка" понять, как настроить тест, поэтому я пытаюсь создать "тестовый конфигуратор"wizard », который настраивает тестовый сценарий, не заставляя пользователя / тестера редактировать все файлы конфигурации вручную.
- Этот мастер соберет соответствующие файлы из «репозитория» и поместит их в папку, где «Консоль Grinder» может представить их пользователю.
Итак, я использую, чтобы выяснить, какие файлы используются Grinder, это использовать AOP (AspectJ) для захвата всех вызовов java.io.FileInputStream(java.io.File)
из любого кода в пакетах org.python.util
и org.python.core
.«Совет», который я применяю к этим точкам соединения, состоит в том, чтобы напечатать имя файла на System.out
.Для этого я использую время загрузки, поэтому я могу запустить код groovy / java / jython с нашим без AOP.Проблема AttributeError
возникает независимо от того, включен я AOP или нет.
У меня есть смутное подозрение, что проблема AttributeError
может быть вызвана некоторым несовпадением загрузчиков классов, когда класс "groovy" выполняет методы PythonInterpreter,но я далеко не уверен в этом.Я не уверен, что groovy выполняет какое-либо редактирование байт-кода времени выполнения , когда загружает классы, и если это смущает PythonInterpreter.
Сам код groovy предварительно скомпилирован, поэтому я использую обычный java.exe для запуска процесса.