Grinder JDBC测试脚本错误“'TestRunner()'的结果不可调用”

时间:2015-10-14 11:01:17

标签: python jython grinder

我使用JDBC.py脚本运行性能测试。磨床日志信息:

  

2015-10-14 18:42:40,132 ERROR com-0 thread-24:aborting thread - {}'TestRunner()'的结果不可调用   net.grinder.scriptengine.jython.JythonScriptExecutionException:'TestRunner()'的结果不可调用           在net.grinder.scriptengine.jython.JythonScriptEngine.createWorkerRunnable(JythonScriptEngine.java:183)〜[grinder-core-3.11.jar:na]           在net.grinder.engine.process.GrinderProcess $ ThreadStarterImplementation $ 2.create(GrinderProcess.java:784)〜[grinder-core-3.11.jar:na]           在net.grinder.engine.process.GrinderThread.run(GrinderThread.java:90)〜[grinder-core-3.11.jar:na]           在java.lang.Thread.run(Thread.java:744)[na:1.7.0_45]   2015-10-14 18:42:40,132 ERROR com-0 thread-3:aborting thread - {}'TestRunner()'的结果不可调用   net.grinder.scriptengine.jython.JythonScriptExecutionException:'TestRunner()'的结果不可调用           在net.grinder.scriptengine.jython.JythonScriptEngine.createWorkerRunnable(JythonScriptEngine.java:183)〜[grinder-core-3.11.jar:na]           在net.grinder.engine.process.GrinderProcess $ ThreadStarterImplementation $ 2.create(GrinderProcess.java:784)〜[grinder-core-3.11.jar:na]           在net.grinder.engine.process.GrinderThread.run(GrinderThread.java:90)〜[grinder-core-3.11.jar:na]           在java.lang.Thread.run(Thread.java:744)[na:1.7.0_45]

我修改脚本,但仍然是错误。请帮忙检查一下。

我测试脚本:

# The sorting tes  supports a configurable array length.
# It runs the JavaTest.sort method of the JavaTest class.

from net.grinder.script.Grinder import grinder
from net.grinder.script import Test
from datetime import datetime
from datetime import timedelta
from java.sql import DriverManager
from oracle.jdbc import OracleDriver

########################################
#
# main body of test script starts here
#
########################################

# Get the propeties to access test configuration information
properties = grinder.getProperties()

# The description is a property (instead of a hardcoded string in this script)
#test = Test(1, properties.get("javatest.description"))
test = Test(2, properties.get("javatest.description"))

# select the method for which to collect information
# test.record(WriteMulitpleLittleFile.write)

# initialize data for compressing
# fileName = properties.get("javatest.fileToCompress")
# grinder.logger.info("data file to compress is " + fileName)
# JavaTest.initializeCompression(fileName)

# If the run mode is runOnce, the TestRunner class will
# run once.  Otherwise, if the run mode is continuous,
# the TestRunner class will run the test for at least
# the specified duration (but possibly longer)
runMode = properties.get("javatest.runMode")
#WriteMulitpleLittleFile.setParameters(dir, fileSize...)
if runMode == "continuous":
  # figure out how long to run the test
  m = int(properties.getProperty("javatest.durationMinutes", "0"))
  h = int(properties.getProperty("javatest.durationHours", "0"))
  d = int(properties.getProperty("javatest.durationDays", "0"))
  duration = timedelta(minutes=m,hours=h,days=d)
  grinder.logger.info("run mode is continuous, duration is " + str(duration))
elif runMode == "runOnce":
  grinder.logger.info("run mode is run once")
  duration = timedelta(minutes=0)
else:
  grinder.logger.info("run mode not set or not recongized, default to run once")
  duration = timedelta(minutes=0)

########################################
#
# The TestRunner class is used by The Grinder to perform the test
#
########################################

#test1 = Test(1, "Database insert")
test2 = Test(2, "Database query")

# Load the Oracle JDBC driver.
DriverManager.registerDriver(OracleDriver())

def getConnection():
    return DriverManager.getConnection(
        "jdbc:oracle:thin:@den00bvr.us.oracle.com:1521:orcl", "PBPUBLIC", "PBPUBLIC")

def ensureClosed(object):
    try: object.close()
    except: pass

# One time initialisation that cleans out old data.
connection = getConnection()
statement = connection.createStatement()

#try: statement.execute("drop table grinder_test1126")
#except: pass

#statement.execute("create table grinder_test1126(thread number, run number)")

ensureClosed(statement)
ensureClosed(connection)

class TestRunner:
   def __init__(self):
#        tid = grinder.threadNumber

#        if (grinder.threadNumber % 2 == 0):
#             Even threadNumber
#             Do insertStatement
#        else:
#             Odd threadNumber
#             Do queryStatement

#   def __call__(self):
#       self.testRunner()

        endTime = datetime.now() + duration
        notDone = True
        while notDone:
         connection = None
         insertStatement = None
         queryStatement = None
         notDone = datetime.now() < endTime

        try:
            connection = getConnection()
#           insertStatement = connection.createStatement()
            queryStatement = connection.createStatement()

#           test1.record(insertStatement)
#           insertStatement.execute("insert into grinder_test1126 values(%d, %d)" %
#                                   (grinder.threadNumber, grinder.runNumber))

            test2.record(queryStatement)
            queryStatement.execute("select * from employee")

        finally:
#           ensureClosed(insertStatement)
            ensureClosed(queryStatement)
            ensureClosed(connection)

1 个答案:

答案 0 :(得分:0)

根据文件,

  

TestRunner实例必须是可调用的

     

如果Python对象定义了调用方法,则该对象是可调用的。每   工作线程执行测试脚本的多次运行,如   由属性grinder.runs配置。对于每次运行,工人   线程调用其TestRunner;因此可以考虑调用方法   作为一个运行的定义。

您的脚本需要调用功能才能被归类为可调用。