Parameters+DataProviderを使用してデータ駆動インタフェースのテストを完了


以前、いくつかの異なるインタフェース自動化フレームワークの構築構造を考えたことがあります.これは、xmlに格納されているsql文を通じてmysqlを遍歴して対応するテストデータを取得し、テストを完了する効果です.利点は、完全にデータ駆動テストであり、新しいインタフェースがある場合、コードを変更する必要はなく、mysqlにテストデータを追加し、新しいテストシーンでxmlを変更するだけでよいことです.簡単な実装の考え方を説明します.
1.DataProviderの構成ForMysqlクラスは、データベースをリンクしてテストデータを取得するために使用されます.
import java.sql.*;
import java.util.*;

/**
 *       
 */
public class DataProvider_ForMysql implements Iterator {

    ResultSet result;  //   
    List> dataList = new ArrayList>();  //        list
    int rowNum=0;     //   
    int curRowNo=0;   //    

    public DataProvider_ForMysql(String ip, String port, String baseName,
                                 String userName, String password, String sql) throws ClassNotFoundException, SQLException {

        Class.forName("com.mysql.cj.jdbc.Driver");
        String url = String.format("jdbc:mysql://%s:%s/%s?serverTimezone=UTC", ip, port, baseName);
        //    
        Connection conn = DriverManager.getConnection(url, userName, password);
        //        
        Statement stmt = conn.createStatement();
        //  sql  ,       
        result = stmt.executeQuery(sql);
        //       
        ResultSetMetaData rd = result.getMetaData();

        //    
        while (result.next()) {
            Map map = new HashMap();
            //    ,    id,  i  2
            for (int i = 1; i <= rd.getColumnCount(); i++) {
                String key = result.getMetaData().getColumnName(i);
                String value = result.getString(i);
                map.put(key,value);
            }
            dataList.add(map);
        }

        this.rowNum = dataList.size();

        conn.close();
        stmt.close();
    }


    @Override
    public boolean hasNext() {
        if(rowNum==0||curRowNo>=rowNum){
            return false;
        }else{
            return true;
        }
    }

    @Override
    public Object[] next() {
        Map s=dataList.get(curRowNo);
        Object[] d=new Object[1];
        d[0]=s;
        this.curRowNo++;
        return d;
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException("remove unsupported");
    }
}



2.xmlファイルの構成


    
        
        
            
        
    
    
        
    


3.テスト実行
public class TestCase {

    String sql;   //xml    sql  


	/**
	*   name  xml      sql  
	*/
    @Parameters({"valueName"})
    @BeforeClass()
    public void beforeClass(String sql) {
        this.sql = sql;
    }

   
    /**
     * XML  SQL         ,        , SQL               
     */
    @DataProvider(name = "testData")
    private Iterator getData(){
        try {
            return new DataProvider_ForMysql(TestConfig.DB_IP, TestConfig.DB_PORT,
                TestConfig.DB_BASE_NAME,TestConfig.DB_USERNAME, TestConfig.DB_PASSWORD, sql);
        } catch (ClassNotFoundException e || SQLException e) {
            e.printStackTrace();
        } 
        return null;
    }


	/**
	*       ,  map           
	*/
    @Test(dataProvider = "testData")
    public void test(Map dataMap) {
        System.out.println(dataMap.toString());
    }
}

mysqlでどれだけのデータが読み出されても、1つ1つ実行されるので、テストシーンでは、sql文でテストデータをフィルタする方法と、使用例と使用例間のデータ依存性を考慮する必要があります.後の文章では、この方面の内容の共有もあります.疑問の小さい仲間は下で伝言を残すことができて、私は問題に対して絶えず文章の内容を最適化して、効果的にもっと多くの人を助けることができることを望んで、ありがとうございます~