以下のエディターは、Java 自動テストでの複数のデータ ソース間の切り替えに関する記事 (例付きの説明) を提供します。編集者はこれがとても良いと思ったので、参考として共有します。エディターをフォローして見てみましょう
自動テストを行う場合、データ駆動型は非常に重要な概念です。データがスクリプトから分離され、膨大な量のデータに直面すると、データの管理が大きな問題になります。データ 開発プロセス中と同様に、場合によっては MYSQL に接続する必要がある場合もあれば、SQL SERVER に接続する必要がある場合もあります。次の例では、データ ソースから始めて、それを段階的に示します:
1. 外部ファイルを使用してデータ ドリブンを記述する基本的な方法
1.1 データ ドリブンを行う場合、 JAVA のプロパティ ファイルに格納されているデータを使用します: data.properties
username=test password=123456
1.2 プロパティ ファイルを解析します
public class PropertiesHandler { private static Properties loadPropertiesFile(String filePath){ Properties p = new Properties(); InputStream in = null; try { in = new FileInputStream(new File(filePath)); p.load(in); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ try { if(in != null){ in.close(); } } catch (IOException e) { e.printStackTrace(); } } return p; } /** * 将property转换成Map * @param key * @return */ @SuppressWarnings({ "rawtypes", "unchecked" }) public static Map<String, String> getPropertyData(String filePath){ try{ return new HashMap<String, String>((Map)PropertiesHandler.loadPropertiesFile(filePath)); }catch(Exception e){ e.printStackTrace(); } return new HashMap<String, String>(); } public static void main(String[] args) { System.out.println(PropertiesHandler.getPropertyData("file/data.properties")); } }
1.3 格納するために使用される TestBase クラスを作成しますTestNg DataProvider
public class TestBase { @DataProvider public Object[][] dataProvider(){ return this.getTestData(); } private Object[][] getTestData(){ PropertiesData testData = new PropertiesData(); List<Map<String, String>> listData = testData.getTestMethodData(); Object[][] object = new Object[listData.size()][]; for (int i = 0; i < listData.size(); i++) { object[i] = new Object[]{listData.get(i)}; } return object; } }
データ型 List
1.4 1.3で登場したPropertiesDataクラス、今度はこのクラスを実装してみましょう
public class PropertiesData { public List<Map<String, String>> getTestMethodData(){ List<Map<String, String>> list = new ArrayList<Map<String, String>>(); list.add(PropertiesHandler.getPropertyData("file/data.properties")); return list; } }
1.5 データ解析クラス、データ読み込みクラス、データ提供用の基本クラスがあるので、テスト メソッドを結合し、これら 3 つの基本クラスを融合して、データ ソースとしての外部ファイルの完全な例を形成しました:
public class TestDemo extends TestBase{ @Test(dataProvider="dataProvider") public void testDemo(Map<String, String> param){ System.out.println(param.get("username")); System.out.println(param.get("password")); } }
II。属性ファイルを txt ファイルに変更します。実装
2.1 データソースが複数ある場合、txt を使用してデータを保存したいとします。 data.txt に json 文字列が保存されています
{ "username":"test", "password":"123456" }
2.2 この txt ファイルを読み出します
public class FileUtils { public static String readFile(String fileName) { InputStream is = null; StringBuffer sb = new StringBuffer(); try { is = new FileInputStream(fileName); byte[] byteBuffer = new byte[is.available()]; int read = 0; while((read = is.read(byteBuffer)) != -1){ sb.append(new String(byteBuffer, 0, read)); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ try { if(is!=null){ is.close(); } } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); } public static void main(String[] args) { System.out.println(FileUtils.readFile("file/data.txt")); } }
2.3 読み取ったJSON文字列を解析します(ここではJARパッケージ、gson.jarを使用する必要があります)
public class TxtData { public List<Map<String, String>> getTestMethodData(){ List<Map<String, String>> list = new ArrayList<Map<String, String>>(); String data = FileUtils.readFile("file/data.txt"); Gson gson = new Gson(); Map<String, String> dataMap = gson.fromJson(data, new TypeToken<Map<String, String>>(){}.getType()); list.add(dataMap); return list; } }
2.4 TxtDataクラスを使用します。つまり、PropertiesDataが配置されている場所を置き換えます。クラスは、TxtData クラスとともに TestBase クラスで使用されます
private Object[][] getTestData(){ TxtData testData = new TxtData(); List<Map<String, String>> listData = testData.getTestMethodData(); Object[][] object = new Object[listData.size()][]; for (int i = 0; i < listData.size(); i++) { object[i] = new Object[]{listData.get(i)}; } return object; }
2.5 TestDemo テスト クラスを実行した後、結果は PropertiesData クラスを使用する前に表示された結果とまったく同じであることがわかりました。
3. インターフェースを使用して実装します3.1 上記の 2 つのデータ ソースの場合、データ ソースにコンテンツをロードします。ロードされたデータ型は次のとおりです。このようにして、JAVA のインターフェースを使用してコードを再構築することができます。もちろん、最初にインターフェース
public interface DataInterface { public List<Map<String, String>> getTestMethodData(); }
public class PropertiesData implements DataInterface{ public List<Map<String, String>> getTestMethodData(){ List<Map<String, String>> list = new ArrayList<Map<String, String>>(); list.add(PropertiesHandler.getPropertyData("file/data.properties")); return list; } }
public class TxtData implements DataInterface{ public List<Map<String, String>> getTestMethodData(){ List<Map<String, String>> list = new ArrayList<Map<String, String>>(); String data = FileUtils.readFile("file/data.txt"); Gson gson = new Gson(); Map<String, String> dataMap = gson.fromJson(data, new TypeToken<Map<String, String>>(){}.getType()); list.add(dataMap); return list; } }
private DataInterface getDataInstance(String key){ DataInterface data = null; try { data = (DataInterface) Class.forName(key).newInstance(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { e.printStackTrace(); } return data; }
private Object[][] getTestData(){ DataInterface testData = this.getDataInstance("com.test.testdata.PropertiesData"); List<Map<String, String>> listData = testData.getTestMethodData(); Object[][] object = new Object[listData.size()][]; for (int i = 0; i < listData.size(); i++) { object[i] = new Object[]{listData.get(i)}; } return object; }
private Object[][] getTestData(){ DataInterface testData = this.getDataInstance("com.test.testdata.TxtData"); List<Map<String, String>> listData = testData.getTestMethodData(); Object[][] object = new Object[listData.size()][]; for (int i = 0; i < listData.size(); i++) { object[i] = new Object[]{listData.get(i)}; } return object; }
4. データロードクラスのパスを設定可能4.1 このとき、設定ファイルconfig.propertiesにデータロードクラスのパスを記述することが考えられます
DataSource=com.test.testdata.TxtData
public class Config { public static String DATA_SOURCE; static{ Map<String, String> map = PropertiesHandler.getPropertyData("config/config.properties"); DATA_SOURCE = map.get("DataSource"); } }
private Object[][] getTestData(){ DataInterface testData = this.getDataInstance(Config.DATA_SOURCE); List<Map<String, String>> listData = testData.getTestMethodData(); Object[][] object = new Object[listData.size()][]; for (int i = 0; i < listData.size(); i++) { object[i] = new Object[]{listData.get(i)}; } return object; }
5. 複数のデータソース間の切り替え 5.1 如果一个测试类里有两个测试方法,那么在配置文件里配置好数据源后,就表示这两个测试方法都将会加载同样的数据源,但如果我们希望一个测试方法用属性文件的数据源,另一个方法用TXT的数据源,这个如何办?也就是需要实现在全局配置化后,局部可再次选择数据源。我将会利用到JAVA里的注解,来实现。所以我们先定义一个DataSource的注解 5.2 解析该注解 5.3 该注解的使用 5.4 TestBase类里的getTestData()方法再次的更改,要利用上这个注解解析出来的值 这段代码可以看到,如果测试方法标注DataSource,则会以标注的注解值为准,否则则会以全局配置的值为准。 5.5 在TestDemo里多加一个测试方法,以示区别 上面的测试类中,两个测试方法,一个用了全局的配置数据源值,一个用了注解数据源值。大家可以运行的看看结果。 六. 工程结构图: 以上がJava自動テストにおける複数データソースの切り替えについて詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DataSource {
String value();
}
public class DataSources {
public static String getDataSource(Method method){
DataSource ds = method.getAnnotation(DataSource.class);
if(ds != null){
return ds.value();
}
return null;
}
}
@DataSource("com.test.testdata.PropertiesData")
@Test(dataProvider="dataProvider")
public void testDemo(Map<String, String> param){
System.out.println(param.get("username"));
System.out.println(param.get("password"));
}
private Object[][] getTestData(Method method){
String sourceKey = DataSources.getDataSource(method);
if(sourceKey==null){
sourceKey = Config.DATA_SOURCE;
}
DataInterface testData = this.getDataInstance(sourceKey);
List<Map<String, String>> listData = testData.getTestMethodData();
Object[][] object = new Object[listData.size()][];
for (int i = 0; i < listData.size(); i++) {
object[i] = new Object[]{listData.get(i)};
}
return object;
}
public class TestDemo extends TestBase{
@DataSource("com.test.testdata.PropertiesData")
@Test(dataProvider="dataProvider")
public void testDemo(Map<String, String> param){
System.out.println(param.get("username"));
System.out.println(param.get("password"));
}
@Test(dataProvider="dataProvider")
public void testDemo1(Map<String, String> param){
System.out.println(param.get("username"));
System.out.println(param.get("password"));
}
}