我在尝试运行嵌入在已编译的 groovy 应用程序中的 jython 代码时遇到问题。将相同的 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 类实例的方法,并打印 Web 服务存根的 toString 输出。 - 打印“调用方法调用”消息。
- 永远不会打印“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,但如果它是导致问题的 groovy,则可能不得不切换到普通的旧 java。
- 这样做的原因是我需要找出 Grinder 在给定的测试场景中实际使用了哪些文件。
- 我们有数百个
*.py
文件和配置文件等,但其中只有一个子集用于一个特定的测试场景。所有这些都用于某些测试场景。 - 这使得“初学者”很难理解如何配置测试,因此我正在尝试构建一个“测试配置向导”来设置测试场景,而不强制用户/测试人员手动编辑所有配置文件。
- 该向导将从“存储库”中收集相关文件,并将它们放在“Grinder 控制台”可以将它们呈现给用户的文件夹中。
- 我们有数百个
因此,我用来找出 Grinder 使用了哪些文件的方法是使用 AOP (AspectJ) 来捕获来自and包java.io.FileInputStream(java.io.File)
中任何代码的所有调用。我应用于这些连接点的“建议”是将文件名打印到. 我为此使用加载时编织,因此我可以在未启用 AOP 的情况下运行 groovy/java/jython 代码。无论我是否启用了 AOP,都会出现问题。org.python.util
org.python.core
System.out
AttributeError
我有一个模糊的怀疑,AttributeError
当“groovy”类执行 PythonInterpreter 方法时,问题可能是由某些类加载器不匹配引起的,但我对此还不确定。我不确定 groovy在加载类时是否在进行任何类型的运行时字节码编辑,以及这是否会混淆 PythonInterpreter。
groovy 代码本身是预编译的,因此我使用常规 java.exe 来启动该进程。