Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Integrate test engine #601

Closed
terrymanu opened this issue Feb 15, 2018 · 10 comments
Closed

Integrate test engine #601

terrymanu opened this issue Feb 15, 2018 · 10 comments
Assignees

Comments

@terrymanu
Copy link
Member

目前Sharding-JDBC已经有一个自动测试框架,代码分为两部分:

  1. 解析测试在SQLParsingEngineTest,功能:断言解析后的解析上下文,但并未断言全
  2. 整合测试在AllIntegrateTests,功能:它以XML方式定义SQL,每条SQL由SQL解析单元测试引擎和整合测试引擎驱动,每个引擎分别为H2、MySQL、PostgreSQL、SQLServer和Oracle数据库运行测试用例。SQL解析单元测试全面覆盖SQL占位符和字面量维度。整合测试进一步拆分为策略和JDBC两个维度,策略维度包括分库分表、仅分表、仅分库、读写分离、动态表等策略,JDBC维度包括Statement、PreparedStatement。因此,1条SQL会驱动5种数据库的解析 * 2种参数传递类型 + 5种数据库 * 5种分片策略 * 2种JDBC运行方式 = 60个测试用例。

但是功能仍有待提升,目前的大致想法:

  1. SQL解析与整合测试一体化。
  2. 测试框架的测试用例缺失较严重,添加测试用例仍然比较麻烦,需要设计一个更加便捷的自动化框架。
  3. 目前整合测试采用的dbunit,但dbunit并不支持各种jdbc的断言,如:getResultSet等,想抛离dbunit,重写一个SQL断言框架。

因为测试框架目前还可以勉强使用,但仍有很大提升空间,因此征询志愿者领取任务,感兴趣的同学欢迎联系我。

@qiankunshe
Copy link
Contributor

qiankunshe commented Feb 24, 2018

  1. xml用例配置,用例定义、用例验证
  2. 用例定义:
    a) 配置使用 statement和preparestatement 模式 分为或,且
    b) execute,executeUpdate或executeQuery 执行sql
    c) 配置可以通过下标或者labelName 获取数据验证,验证可以是验证类型,验证数据,验证数据+排序(验证数据顺序或不验证)
  3. 现通过dbunit初始化数据
  4. 使用或验证
    a) 获取xml配置,执行检查工厂传入xml配置,返回检查对象,
    b) 调用检查对象的检查方法 传入 数据库连接对象
    c) 返回检查结果,如果有错误,断言失败

xml 格式

<root>
    <config statement="true" preparestatement="true">
        <execute >
            <sql>
            </sql>
        </execute>
        <executeUpdate>
            <sql>
            </sql>
        </executeUpdate>
        <executeQuery>
            <sql>
            </sql>
        </executeQuery>
    </config>
    <check order="true">
        <t_order order_id="1" order_id_type="int" user_id="1" user_id_type="int" />
    </check>
</root>

@terrymanu
Copy link
Member Author

terrymanu commented Feb 26, 2018

这个xml应该还需要讨论,主要有以下几点:

  1. 缺少sharding rule的配置维度,包括仅分库、仅分表、又分库又分表、包含default data source、仅读写分离、仅分库+读写分离、仅分表+读写分离、分库分表+读写分离、使用Hint的读写分离。
  2. statement="true" preparestatement="true"这两个个人认为可以不需要配置,因为这是测试用例必须跑的项目
  3. execute和executeQuery以及execute和executeUpdate的SQL是一组,应该没有必要配置两套。测试框架应该根据SQL的类型自动判断是执行execute和executeQuery,还是execute和executeUpdate,两两一组
  4. SQL参数如何传递需要明确
  5. check的order=ture不太理解是什么,什么情况下是无需检查顺序的么
  6. init数据如何与这个xml一体化
  7. 缺失parse context断言

因此,我感觉一个xml的伪代码可能大致是:

<asserts sharding-rule-config="xxx">
    <assert id="" init-data-file="xxx" expected-data-file="xxx">
        <sql></sql>
        <parameters>
            <parameter value="1" type="int">
            <parameter value="test" type="String">
        </parameters>
        <parse-context>
            <table />
            <select-items />
            <order-by-items />
            <group-by-items />
            ... other context
        </parse-context>
    <assert/>
</asserts>

@qiankunshe
Copy link
Contributor

qiankunshe commented Feb 26, 2018

我本来想分成多步走,第一步是,先代替 断言部分 ,所以没有包含 1和6 部分。
第1点中 sharding-rule-config 是不是需要放入到一个独立文件中,这里只是用于引用
第2点没问题
第3点 根据上面这个xml,是不是可以这样理解如果是包含insert 和update 、delete是execute和executeUpdate ,如果是 select就是execute和executeQuery
第4点,在statement中,parameters 标签下的sql 参数,需要我们自己进行替换
第5点,这参数只是在验证数据时使用,属于一个让验证数据简单些的配置,就是检查的数据,不要求顺序
第7点,parse-context 我有些不太理解,这个加上去是不是为了,sql解析类型的检查用的,就是开始说的希望,sql 解析验证和数据解析验证一起进行的那个?

@terrymanu
Copy link
Member Author

回答一下上面的问题:
步骤1和步骤6应该是一体化的一部分,我觉得在设计时至少需要考虑。
因此上面提到的第1点,就是增加sharding rule 和 init data 文件的引用。
第3点,是正确的。
第4点,维持现状我觉得就可以,目前是用%s占位,然后替换为?或者是真实的值。
第5点,我觉得都应该断言顺序,不然断言是不严谨的。
第7点,可以看一下SQLParsingEngineTest,这个目前就是用于断言解析上下文的。目前有两个问题,一个是断言不严谨,并没有断言全,另一个是没有和整合测试一体化。

另外,还有两个需求需要讨论

  1. 对于statement和preparedStaement这个维度还需要增加一个,就是在jdbc url链接里增加了useServerPrepStmts=true的prepareStatement的执行。
  2. 除了对目前的sharding-jdbc进行测试,还需要可以启动sharding-jdbc-server进行测试,也就是说,全套测试用例,在sharding-jdbc-server架构下需要再自动化运行一遍。

@terrymanu terrymanu changed the title SQL自动化测试框架 Integrate test engine Mar 16, 2018
@terrymanu
Copy link
Member Author

terrymanu commented Mar 16, 2018

Integrate test engine's folder structure:

integrate
  -- config
      -- ${rule-name}.{db-type}.yaml    (+)
  -- init
      -- ${db-name}.xml                 (+)
  -- expected
      -- ${expected-name}.xml           (+)
  -- assert
      -- dql
          -- ${assert-type}.xml         (+)
      -- dml
          -- ${assert-type}.xml         (+)
      -- ddl
          -- ${assert-type}.xml         (+)
      -- tcl
          -- ${assert-type}.xml         (+)
      -- dal
          -- ${assert-type}.xml         (+)

rule-name enum: sharding-tables, sharding-databases, sharding-databases-tables, master-slave, master-slave-sharding-tables, master-slave-sharding-databases, master-slave-sharding-databases-tables.

assert-type example: simple-select, group-by-select, update, create, etc.

@terrymanu
Copy link
Member Author

terrymanu commented Mar 16, 2018

xml example for init & expected:

<dataset>
    <metadata>
        <table name="t_order">
            <cloumn name="order_id" type="int" />
            <cloumn name="user_id" type="int" />
            <cloumn name="status" type="varchar" />
        </table>
    </metadata>
    <data>
        <t_order order_id="1600" user_id="16" status="init" />
        <t_order order_id="1601" user_id="16" status="init" />
        <t_order order_id="2600" user_id="26" status="init" />
        <t_order order_id="2601" user_id="26" status="init" />
        <t_order_item item_id="160001" order_id="1600" user_id="16" status="init" />
        <t_order_item item_id="160002" order_id="1600" user_id="16" status="init" />
        <t_order_item item_id="160101" order_id="1601" user_id="16" status="init" />
        <t_order_item item_id="160102" order_id="1601" user_id="16" status="init" />
        <t_order_item item_id="260001" order_id="2600" user_id="26" status="init" />
        <t_order_item item_id="260002" order_id="2600" user_id="26" status="init" />
        <t_order_item item_id="260101" order_id="2601" user_id="26" status="init" />
        <t_order_item item_id="260102" order_id="2601" user_id="26" status="init" />
    </data>
</dataset>

@terrymanu
Copy link
Member Author

terrymanu commented Mar 16, 2018

xml example for assert:

<asserts>
    <assert id="test" expected-data-file="xxx.xml">
        <sql>select order_id,user_id from t_order where order_id in (%s,%s,%s)</sql>
        <parameters>
            <parameter value="1000" type="int"/>
            <parameter value="1101" type="int"/>
            <parameter value="2200" type="int"/>
        </parameters>
        <parse-context>
            <tables>
                <table name="t_order" />
            </tables>
            <table-tokens>
                <table-token begin-position="40" original-literals="t_order" />
            </table-tokens>
            <conditions>
            	...
            </conditions>
        </parse-context>
    </assert>

    <assert id="test2" expected-data-file="xxx.xml" expected-update-count="1">
        <sql>update t_order set user_id = 10111 where order_id = %s</sql>
        <expected-sql>select order_id,user_id from t_order where order_id = %s</expected-sql>
        <parameters>
            <parameter value="1000" type="int"/>
        </parameters>
        <parse-context>
            ...
        </parse-context>
    </assert>
</asserts>

Load init-data automatically.

terrymanu added a commit that referenced this issue May 3, 2018
terrymanu added a commit that referenced this issue May 3, 2018
terrymanu added a commit that referenced this issue May 3, 2018
terrymanu added a commit that referenced this issue May 3, 2018
terrymanu added a commit that referenced this issue May 4, 2018
terrymanu added a commit that referenced this issue May 4, 2018
terrymanu added a commit that referenced this issue May 4, 2018
terrymanu added a commit that referenced this issue May 4, 2018
terrymanu added a commit that referenced this issue May 4, 2018
terrymanu added a commit that referenced this issue May 4, 2018
terrymanu added a commit that referenced this issue May 4, 2018
terrymanu added a commit that referenced this issue May 4, 2018
haocao added a commit that referenced this issue Aug 1, 2018
haocao added a commit that referenced this issue Aug 2, 2018
haocao added a commit that referenced this issue Aug 2, 2018
haocao added a commit that referenced this issue Aug 2, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants