使用Spock和Robospock创建SQLite数据库的单元测试

 mobiledu2502917243 发布于 2023-01-01 16:27

Spock是Groovy和Java生态系统中使用最广泛的框架之一,它允许以非常直观的语言创建BDD测试,并促进一些常见任务,如模拟和可扩展性.它从人群中脱颖而出的是它美丽而富有表现力的规范语言.由于其JUnit运行程序,Spock与大多数IDE,构建工具和持续集成服务器兼容.要使用Spock,您基本上需要执行一系列步骤,例如遵循配方,这将允许您有效地实现单元测试和Web集成.

您当前的错误消息显示为:

Create a sqlite database for Android FAILED

尝试这些步骤,看看它是如何进行的:

包括你的代码getWritableDatabase和getReadableDatabase应该有帮助:

jokesHelper dbHelper = new jokesHelper(getBaseContext());
SQLiteDatabase db = dbHelper.getWritableDatabase();

这样,Android将能够管理和缓存连接.

然而,如果您从getBaseContext收到任何错误消息,请尝试卸载测试插件并使用integrate-with --eclipse重新创建STS资源(.classpath和.project),然后它应该可以工作.

如果您对getSpecificationContext有任何问题,则表示遗漏了一些细节,您需要仔细检查您的规格.

如果您不使用Eclipse,要使用spock 创建Java Jar文件,您可以像往常一样通过命令行Java开发工具将其与Emacs连接,例如Sun的JDK或企业开发预期的任何其他方法.要仅运行SampleTest,必须使用Java系统属性从命令行调用测试任务:

gradle -Dtest.single=Sample test

或者

gradle -Dtest.single=SoapTest clean test

还要检查正在使用的目录的权限.如果还没有完成,请记住包含依赖项:

dependencies {
    classpath 'com.android.tools.build:gradle:0.8.+'
    classpath 'org.robospock:robospock-plugin:0.4.0'
}

并通知您正在使用的测试目录,例如srcDirs.请记住("Es ist wichtig das man hier die richtige Resources-Klasse importiert")导入类所需的正确资源非常重要.因此,还包括 "defaultConfig"中的"build.gradle":

testPackageName "com.yourpackage.test"
testInstrumentationRunner "android.test.InstrumentationTestRunner"
testFunctionalTest true

该斯波克和Robospock是可以帮助有用的资源,开发创新型工具的单元测试.或者,您也可以使用TCL测试等工具.TCL测试是SQLite最古老的测试集,是您可以采用的最佳方法.实际上,SQLite起源于Tcl扩展.SQLite的许多测试和开发工具都是用Tcl编写的.除了本机C API之外,Tcl扩展是SQLite核心团队支持的唯一API.

要启用Tcl绑定,请从SQLite网站下载SQLite源的TEA(Tcl扩展体系结构)分发.此版本的代码基本上是合并分发,其中Tcl绑定附加到末尾.这将构建为Tcl扩展,然后可以将其导入任何Tcl环境.

在此输入图像描述

应该遵循非常具体的步骤,注意每一个细节都是必不可少的,因为它可以使您的测试成功运行与否.

该仪器架构为测试框架的基础.Instrumentation控制正在测试的应用程序,并允许注入应用程序运行所需的模拟组件.例如,您可以在应用程序启动之前创建模拟上下文,并让应用程序使用它们.

在此输入图像描述

可以使用此方法控制应用程序与周围环境的所有交互.您还可以在受限制的环境中隔离应用程序,以便能够预测结果,强制某些方法返回的值或模拟ContentProvider,数据库甚至文件系统内容的持久和未更改的数据.因此,在您的活动中指定您正在运行测试的信息也很重要:


    
        
            
        
        
        
        
    

如果您运行JNI以使用本机代码操作数据库,则有两种方法可以使用SQLite加载扩展.一种是通过C API调用,一种是通过SQL函数调用与C API函数相同的代码.在这两种情况下,您都提供文件名和(可选)入口点函数的名称:

int sqlite3_load_extension( sqlite3 *db, const char *ext_name,
    const char *entry_point, char **error )

加载可加载扩展的另一种方法是使用内置的SQL函数:

load_extension( 'ext_name' )
load_extension( 'ext_name', 'entry_point' )

此函数类似于C sqlite3_load_extension()调用,但有一个主要限制.因为这是一个SQL函数,所以在调用它时,根据定义,将在加载扩展时执行一条SQL语句.这意味着任何使用load_extension()SQL函数加载的扩展都将完全无法重新定义或删除自定义函数,包括一组专门的like()函数.正如预期的那样,使用合适的语法加载数据的方法与Java类似.

在此输入图像描述

调试指令仅用于测试和开发目的,因为它们会增加显着的开销并使一切运行明显变慢,就像包含抛出异常一样.当你运行单元测试,你需要将它们设置相应的,同时检查,以避免您的数据库没有得到破坏.基本上,为调试设置实现最佳调整将改进并帮助您顺利地以最佳方式运行测试.

除了所有其他构建指令外,SQLite还有相当数量的SQLITE_OMIT_*编译时指令.这些旨在从构建中删除核心功能,以使核心数据库库尽可能小巧紧凑.为了使用大多数这些省略指令,您需要从源代码控制树中的开发源构建SQLite.当应用于源分发或预构建的合并时,大多数省略指令将无法正常工作.还要注意,这些编译时指令不是官方支持的,因为它们不是官方测试链的一部分.对于任何给定版本的SQLite,如果启用了任意的省略标志集,则可能存在编译问题和运行时问题.

在此输入图像描述

当然,你不需要成为一名武士来为Android上的SQLite运行单元测试,尽管它可能有所帮助.

1 个回答
  • Spock是Groovy和Java生态系统中使用最广泛的框架之一,它允许以非常直观的语言创建BDD测试,并促进一些常见任务,如模拟和可扩展性.它从人群中脱颖而出的是它美丽而富有表现力的规范语言.由于其JUnit运行程序,Spock与大多数IDE,构建工具和持续集成服务器兼容.要使用Spock,您基本上需要执行一系列步骤,例如遵循配方,这将允许您有效地实现单元测试和Web集成.

    您当前的错误消息显示为:

    Create a sqlite database for Android FAILED
    

    尝试这些步骤,看看它是如何进行的:

    包括你的代码getWritableDatabase和getReadableDatabase应该有帮助:

    jokesHelper dbHelper = new jokesHelper(getBaseContext());
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    

    这样,Android将能够管理和缓存连接.

    然而,如果您从getBaseContext收到任何错误消息,请尝试卸载测试插件并使用integrate-with --eclipse重新创建STS资源(.classpath和.project),然后它应该可以工作.

    如果您对getSpecificationContext有任何问题,则表示遗漏了一些细节,您需要仔细检查您的规格.

    如果您不使用Eclipse,要使用spock 创建Java Jar文件,您可以像往常一样通过命令行Java开发工具将其与Emacs连接,例如Sun的JDK或企业开发预期的任何其他方法.要仅运行SampleTest,必须使用Java系统属性从命令行调用测试任务:

    gradle -Dtest.single=Sample test
    

    或者

    gradle -Dtest.single=SoapTest clean test
    

    还要检查正在使用的目录的权限.如果还没有完成,请记住包含依赖项:

    dependencies {
        classpath 'com.android.tools.build:gradle:0.8.+'
        classpath 'org.robospock:robospock-plugin:0.4.0'
    }
    

    并通知您正在使用的测试目录,例如srcDirs.请记住("Es ist wichtig das man hier die richtige Resources-Klasse importiert")导入类所需的正确资源非常重要.因此,还包括 "defaultConfig"中的"build.gradle":

    testPackageName "com.yourpackage.test"
    testInstrumentationRunner "android.test.InstrumentationTestRunner"
    testFunctionalTest true
    

    该斯波克和Robospock是可以帮助有用的资源,开发创新型工具的单元测试.或者,您也可以使用TCL测试等工具.TCL测试是SQLite最古老的测试集,是您可以采用的最佳方法.实际上,SQLite起源于Tcl扩展.SQLite的许多测试和开发工具都是用Tcl编写的.除了本机C API之外,Tcl扩展是SQLite核心团队支持的唯一API.

    要启用Tcl绑定,请从SQLite网站下载SQLite源的TEA(Tcl扩展体系结构)分发.此版本的代码基本上是合并分发,其中Tcl绑定附加到末尾.这将构建为Tcl扩展,然后可以将其导入任何Tcl环境.

    在此输入图像描述

    应该遵循非常具体的步骤,注意每一个细节都是必不可少的,因为它可以使您的测试成功运行与否.

    该仪器架构为测试框架的基础.Instrumentation控制正在测试的应用程序,并允许注入应用程序运行所需的模拟组件.例如,您可以在应用程序启动之前创建模拟上下文,并让应用程序使用它们.

    在此输入图像描述

    可以使用此方法控制应用程序与周围环境的所有交互.您还可以在受限制的环境中隔离应用程序,以便能够预测结果,强制某些方法返回的值或模拟ContentProvider,数据库甚至文件系统内容的持久和未更改的数据.因此,在您的活动中指定您正在运行测试的信息也很重要:

    <?xml version="1.0" encoding="utf-8"?>
        <manifest xmlns:android="http://schemas.android.com/apk/res/android"
            package="com.example.aatg.sample.test"
            android:versionCode="1" android:versionName="1.0">
            <application android:icon="@drawable/icon"
                android:label="@string/app_name">
                <uses-library android:name="android.test.runner" />
            </application>
            <uses-sdk android:minSdkVersion="7" />
            <instrumentation
                android:targetPackage="com.example.aatg.sample
                android:name="android.test.InstrumentationTestRunner"
                android:label="Sample Tests" />
            <uses-permission android:name="
                android.permission.INJECT_EVENTS" />
        </manifest>
    

    如果您运行JNI以使用本机代码操作数据库,则有两种方法可以使用SQLite加载扩展.一种是通过C API调用,一种是通过SQL函数调用与C API函数相同的代码.在这两种情况下,您都提供文件名和(可选)入口点函数的名称:

    int sqlite3_load_extension( sqlite3 *db, const char *ext_name,
        const char *entry_point, char **error )
    

    加载可加载扩展的另一种方法是使用内置的SQL函数:

    load_extension( 'ext_name' )
    load_extension( 'ext_name', 'entry_point' )
    

    此函数类似于C sqlite3_load_extension()调用,但有一个主要限制.因为这是一个SQL函数,所以在调用它时,根据定义,将在加载扩展时执行一条SQL语句.这意味着任何使用load_extension()SQL函数加载的扩展都将完全无法重新定义或删除自定义函数,包括一组专门的like()函数.正如预期的那样,使用合适的语法加载数据的方法与Java类似.

    在此输入图像描述

    调试指令仅用于测试和开发目的,因为它们会增加显着的开销并使一切运行明显变慢,就像包含抛出异常一样.当你运行单元测试,你需要将它们设置相应的,同时检查,以避免您的数据库没有得到破坏.基本上,为调试设置实现最佳调整将改进并帮助您顺利地以最佳方式运行测试.

    除了所有其他构建指令外,SQLite还有相当数量的SQLITE_OMIT_*编译时指令.这些旨在从构建中删除核心功能,以使核心数据库库尽可能小巧紧凑.为了使用大多数这些省略指令,您需要从源代码控制树中的开发源构建SQLite.当应用于源分发或预构建的合并时,大多数省略指令将无法正常工作.还要注意,这些编译时指令不是官方支持的,因为它们不是官方测试链的一部分.对于任何给定版本的SQLite,如果启用了任意的省略标志集,则可能存在编译问题和运行时问题.

    在此输入图像描述

    当然,你不需要成为一名武士来为Android上的SQLite运行单元测试,尽管它可能有所帮助.

    2023-01-01 16:28 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有