testng dataprovider接入msyql db初始化参数遇见的问题记录

Posted 哈拉少

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了testng dataprovider接入msyql db初始化参数遇见的问题记录相关的知识,希望对你有一定的参考价值。

自动化接口测试中由于原来用excel时,复制粘贴比较麻烦,且修改参数需要修改工程上传git.
把工程改了一下,dataprovider的参数取值自数据库。

  1. 遇到的问题,测试主类获取 配置项和 sql maaper autowire没有问题,但是test method使用dataprovider时,在dataprovider提供的class中总是无法加载参数和mapper实例。

解决方案:

//author: dongyl

public class SqlDataProvider implements Runnable {

    @Autowired
    private CaseParamMapper caseParamMapper;

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public void run() {
        // 也可在需要的地方获取bean
        caseParamMapper = ApplicationContextProvider.getBean(CaseParamMapper.class);
    }

    @DataProvider(name = "getDbCaseData")
    public Object[][] run(ITestContext context, Method method) {
        run();
        try {
..
            List<CaseParamsModel> paramsList = caseParamMapper.selectParamsByKeys(cprm);
..
//尼玛终于可以使用mapper了。
}


package lli.qa.util;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * 手动获取bean
 */
@Component
public class ApplicationContextProvider implements ApplicationContextAware {
    /**
     * 上下文对象实例
     */
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    /**
     * 获取applicationContext
     * @return
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 通过name获取Bean
     * @param name
     * @return
     */
    public static Object getBean(String name){
        return getApplicationContext().getBean(name);
    }
    /**
     * 通过Class获取Bean
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(Class<T> clazz){
        return getApplicationContext().getBean(clazz);
    }
    /**
     * 通过name,以及Clazz返回指定的Bean
     * @param name
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(String name,Class<T> clazz){
        return getApplicationContext().getBean(name,clazz);
    }
}

  1. 做数据初始化时,新建了个sqlfile文件夹,做.sql文件的初始化,发现尼玛老是找不到路径。
            di.execDataInit(drvierClass,mysqlurl,username,password,  "ew-account-init.sql");


    public void execDataInit(String driverClass,String mysqlurl,String username,String password,String FileName) {
        try{
            ExcuteSqlTool est = new ExcuteSqlTool();
            Connection conn = est.executeSql(driverClass,mysqlurl,username,password, FileName);
            est.closeConn(conn);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    public Connection executeSql(String driverClassName,String url,String username,String password, String sqlFilePath ){
        try {
            Class.forName(driverClassName);
            connection = DriverManager.getConnection(url, username, password);
        } catch (Exception e) {
            e.printStackTrace();
        }

        ClassPathResource rc = new ClassPathResource(sqlFilePath);
        EncodedResource er = new EncodedResource(rc, "utf-8");
        ScriptUtils.executeSqlScript(connection, er);
        return connection;
    }

解决方案:
resource文件需要加入 pom文件标志资源文件夹

    <profiles>
        <profile>
            <id>SQLFILE</id>
            <properties>
                <env>SQLFILE</env>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <build>
                <resources>
                    <resource>
                        <directory>${project.basedir}/src/test/resources/sqlfile</directory>
                    </resource>
                </resources>
            </build>
        </profile>
</profiles>

以上是关于testng dataprovider接入msyql db初始化参数遇见的问题记录的主要内容,如果未能解决你的问题,请参考以下文章

TestNG:一个@Test 有多个@DataProvider

testng-dataprovider

testNG中dataprovider使用的两种方式

TestNG中DataProvider的用法

testNG-dataprovider实现

testNG-dataprovider实现