【发布时间】:2016-03-07 01:14:58
【问题描述】:
我使用robotframework DatabaseLibrary、JayDeBeApi、MS SQL Server JDBC驱动程序设置robotframework测试并成功连接。 但是我得到 SQLServerException: Cannot invoke a rollback operation when the AutoCommit mode is set to "true" when run any sql.
我尝试通过在 jdbc 连接 url 上添加“autoCommit=false”或在 sql 语句中添加“SET IMPLICIT_TRANSACTIONS ON”来关闭 AutoCommit,甚至在 SQL Server Management Studio 上检查 SET IMPLICIT_TRANSACTIONS ANSI 选项,但没有任何运气那些尝试。
这是robotframework maven插件设置
pom.xml
<plugin>
<groupId>org.robotframework</groupId>
<artifactId>robotframework-maven-plugin</artifactId>
<version>1.4.5</version>
<executions>
<execution>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<configuration>
<extraPathDirectories>
<extraPathDirectory>/opt/virtualenv_envs/robot/lib/python2.7/site-packages</extraPathDirectory>
<extraPathDirectory>/usr/local/lib/python2.7/dist-packages</extraPathDirectory>
</extraPathDirectories>
</configuration>
<dependencies>
<dependency> <!-- this jar from local nexus -->
<groupId>com.microsoft.sqlserver.jdbc</groupId>
<artifactId>sqljdbc41</artifactId>
<version>4.1</version>
</dependency>
</dependencies>
</plugin>
下面是机器人测试
dbTest.robot
*** Settings ***
Library DatabaseLibrary
Library String
Library OperatingSystem
Suite Setup SuiteSetup
Suite Teardown SuiteTearDown
*** Variables ***
${JDBC_DRIVER} 'com.microsoft.sqlserver.jdbc.SQLServerDriver'
${JDBC_URL} 'jdbc:sqlserver://{ipAddress}:1433;databaseName={myDB};user={username};password={password}'
*** Test Cases ***
Test Prepare Data
[Documentation] Reset Data
Execute Sql String UPDATE dbo.ImportHeader SET ExtractedOn=null;
*** Keywords ***
SuiteSetup
Connect To Database Using Custom Params jaydebeapi ${JDBC_DRIVER},${JDBC_URL}
SuiteTearDown
Disconnect From Database
这是我在运行机器人测试时遇到的错误
Test Prepare Data :: Reset Data... | FAIL |
DatabaseError: com.microsoft.sqlserver.jdbc.SQLServerException: Cannot invoke a rollback operation when the AutoCommit mode is set to "true".
我对此采取的一个激进的解决方案是修改robotframework DatabaseLibary connection_manager.py,在jaydebeapi 连接上将autoCommit 设置为false,如下所示self._dbconnection.jconn.setAutoCommit(False),但我希望知道如果有的话,比这更好的解决方案。
{你的 python virtualenv}/site-packages/DatabaseLibrary/connection_manager.py
import ConfigParser
from robot.api import logger
class ConnectionManager(object):
"""
Connection Manager handles the connection & disconnection to the database.
"""
def connect_to_database_using_custom_params(self, dbapiModuleName=None, db_connect_string=''):
"""
Loads the DB API 2.0 module given `dbapiModuleName` then uses it to
connect to the database using the map string `db_custom_param_string`.
Example usage:
| # for psycopg2 |
| Connect To Database Using Custom Params | psycopg2 | database='my_db_test', user='postgres', password='s3cr3t', host='tiger.foobar.com', port=5432 |
| # for JayDeBeApi |
| Connect To Database Using Custom Params | JayDeBeApi | 'oracle.jdbc.driver.OracleDriver', 'my_db_test', 'system', 's3cr3t' |
"""
db_api_2 = __import__(dbapiModuleName)
db_connect_string = 'db_api_2.connect(%s)' % db_connect_string
self._dbconnection = eval(db_connect_string)
self._dbconnection.jconn.setAutoCommit(False)
【问题讨论】:
-
在从 Robot Framework/DatabaseLibrary 运行 SQL 时,我遇到了与 RDB 数据库的 JDBC 驱动程序类似的问题。 DatabaseError:oracle.rdb.jdbc.common.RdbException:启用自动提交时操作无效。根据您的“激烈”解决方案,我使用 self._dbconnection.jconn.setAutoCommit(False) 修改 connection_manager.py 。可以将其制定为公认的答案(除非出现更好的答案)。
标签: sql-server jdbc robotframework jaydebeapi