27.1.2. MySQL测试套件

     包含在Unix源码和二进制分发版中的测试系统可以让用户和开发人员对MySQL代码施行回归测试。这些测试可以在Unix上进行,目前它们还不能在原生的Windows环境下进行。

      当前的测试案例套件不能在MySQL中测试所有东西,但是它能发现SQL处理代码,OS/library文件中大多数明显的缺陷,并且在测试复件方面也是非常彻底的。我们的终极目标是对100%的代码进行测试。我们欢迎大家给我们的测试套件添加内容。你可能会特别想贡献出那些检查你系统里功能性危机的测试,因为这将确保未来所有发行版的MySQL会与你的应用程序一起更好地运行。

27.1.2.1. 运行MySQL测试套件

    测试系统包括一个测试语言解释器(mysqltest),一个运行所有测试的外壳脚本(mysql-test-run),用专用语言编写的测试案例,以及它们的预期结果。在系统上编译好之后,在源代码的root下键入make test 或mysql-test/mysql-test-run。如果安装了一个二进制分发版, cd 到安装root (如 /usr/local/mysql), 然后键入 scripts/mysql-test-run。所有测试应该都通过,假使有没通过的,若是一个MySQL里的缺陷,你可以试着找找是因为什么,并且报告这个问题。请参阅27.1.2.3节,“在MySQL测试套件里报告缺陷”

如果你想要运行测试套件的机器上已经运行了一个 mysqld ,只要它不占用9306 和 9307端口,就不用停掉它。如果占用了其中的一个,以可以编辑mysql-test-run把主端口和(或)从端口号改为其它可用的。.

可使用下面指令运行单个测试案例 mysql-test/mysql-test-run test_name.

若一个测试未通过,你可以用--force选项来检查运行着的mysql-test-run看是否是别的测试未通过

27.1.2.2. 扩展MySQL测试套件

你可以用mysqltest 语言编写你自己的测试案例。不幸地是,我们还没有写完相关方面完整地文档。但是,你可以查看我们现有的测试案例,并将它们作为范例。下面几点将有助于你入手:

  • 测试位于 mysql-test/t/*.test

  • 测试案例包括终止声明,测试案例类似于mysql命令行客户端的输入。 默认的声明是一个被发送到MySQL服务器的查询,除非这个声明被识别为内部命令(如 sleep)。

  • 所有产生结果的查询,例如SELECT, SHOW, EXPLAIN等,必须在 @/path/to/result/file之前。那个文件必须包含期望的结果。生成结果文件的一个简单办法是在mysql-test目录运行mysqltest -r < t/test-case-name.test ,然后编辑生成的结果文件,如果需要,可将它们调整到想要的输出端。在那种情况下,要小心避免添加或删除任何不可见的字符,确保只改变文本和(或)删除行。如果插入一行,要确保插入的区域被一个硬标识隔开,且在行尾有一个硬标识。你可能会想要使用od -c来确保你的文本编辑器在编辑 步骤中没有搞乱任何东西。当你发现一个缺陷而不得不编辑mysqltest -r的输出时,我们真希望你不要编辑它。

  • 为和我们的设置一致,你应该把你的结果文件放在mysql-test/r 目录,并取名为test_name.result。如果测试产生不止一个结果,你应该使用诸如 test_name.a.result,test_name.b.result等这样的名字。

  • 如果声明返回一个错误,你可以在声明的前一行使用--error error-number来详细说明它。错误号可能是由“,”分开的可能错误号的列表。

  • 如果你正编写一个重复的测试案例,你应该在测试文件的第一行写:source include/master-slave.inc;。用connection master; 和 connection slave;来切换主案例和从案例。如果你需要对一个替换的连接做点什么,对于主连接,用connection master1;,对于从连接,用connection slave1;。

  • 如果需要在一个循环里做点什么,可以用些这样的内容:

    let $1=1000;
    while ($1)
    {
     # do your queries here
     dec $1;
    }
    
  • 在查询之间休眠,使用sleep命令。此命令支持几分之几秒,所以,例如你想要休眠1.3秒,你可以使用sleep 1.3; 命令

  • 对你的测试案例要运行带附加选项的从案例,以命令行方式把它们放在mysql-test/t/test_name-slave.opt。对于主案例,把它们放在mysql-test/t/test_name-master.opt。

  • 如果对测试套件有问题,和想要献出一个测试案例,发送邮件信息到MySQL 内部插件 邮件列表。请参阅1.7.1.1节,“MySQL邮件列表”。 虽然这个列表不接受附件,你可以把相关文件通过ftp上传到:ftp://ftp.mysql.com/pub/mysql/upload/

27.1.2.3. 在MySQL测试套件中报告缺陷

如果你的MySQL的版本没有通过测试套件,你可以采取如下措施:

  • 在尽可能多地找到出错之时的错误之前,不要发送缺陷报告。查找之时,请使用mysqlbug脚本比便我们能获取你的系统和MySQL版本信息,参阅1.7.1.3节 ,“如何报告缺陷或问题

  • 确保包含了mysql-test-run的输出,以及  mysql-test/r目录下所有.reject文件的内容。

  • 如果测试套件里的测试未通过,用如下命令检查一下看它自己运行时是否通过测试:

    cd mysql-test
    mysql-test-run --local test-name
    

    如果未能通过,你应该用 --with-debug 配置MySQL并使用--debug选项来运行mysql-test-run。如果这样也未能通过,请把追踪文件var/tmp/master.trace 上传到 ftp://ftp.mysql.com/pub/mysql/upload/ 以便我们能检查它。请记得也要包含你系统的完整描述,mysqld 二进制文件的版本,以及你是如何编译它的。

  • 也试着带--force选项运行一下mysql-test-run ,看是否还有别的测试未通过。

  • 如果你是自己编译的MySQL,查看我们的手册看看如何在你的平台上编译MySQL,最好用一个在http://dev.mysql.com/downloads/上我们已经为你编译好的二进制版本。我们所有标准的二进制版本都能通过测试套件的测试!

  • 如果错误是Result length mismatch 或 Result content mismatch ,这意味测试的输出于期望的输出不匹配,这可能是在MySQL或你的mysqld 版本里的缺陷在某些环境下产生稍有不同的结果。

    未通过的测试结果放在和结果文件同主名但扩展名为.reject的文件里。如果测试案例未通过,你应该对两个文件做diff操作。如果你不能发现它们是如何不同,用od -c 命令检查它们,也检查一下文件长度。

  • 如果测试完全未通过,你应该检查mysql-test/var/log目录下的日志文件以获得有关错误的一些提示。

  • 如果你是为调试而编译MySQL,试一下带--gdb和(或)--debug参数运行mysql-test-run 。请参阅E.1.2节,“创建跟踪文件”

    如果你没有为调试而编译MySQL,这应该是你可能去做的。只要带--with-debug参数运行configure。 请参阅2.8节,“使用源码分发版安装MySQL ”

关注编程学问公众号