All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.sitoolkit.tester.app.pagespec.PageSpecConverter Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2013 Monocrea Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.sitoolkit.tester.app.pagespec;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.lang.StringUtils;
import org.sitoolkit.core.infra.repository.DocumentMapper;
import org.sitoolkit.core.infra.repository.DocumentRepository;
import org.sitoolkit.core.infra.repository.RowData;
import org.sitoolkit.tester.domain.test.Locator;
import org.sitoolkit.tester.domain.test.TestScriptDao;
import org.sitoolkit.tester.domain.test.TestStep;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * このクラスは、画面仕様書をテストスクリプトに変換します。
 * mainメソッドを実行すると、画面仕様書ディレクトリ以下の全画面仕様書を読込み、
 * 対応するテストスクリプトをテストスクリプトディレクトリ以下に出力します。
 * これらのファイル、ディレクトリの位置関係を以下に示します。
 *
 * 
{@code
 * project_root
 *   pagespec                       <- 画面仕様書ディレクトリ
 *     a/b/c
 *       画面仕様書_入力画面.xlsx   <- 画面仕様書
 *   pageobj                        <- テストスクリプトディレクトリ
 *     a/b/c
 *       入力画面TestScript.java    <- テストスクリプト
 * }
* * @author yuichi.kuwahara */ public class PageSpecConverter implements ApplicationContextAware { protected final Logger log = LoggerFactory.getLogger(getClass()); private ApplicationContext appCtx; private IOFileFilter fileFilter; private TestScriptDao dao; private DocumentRepository repo; private Map pageSpecConverterMap; private String pagespecDir = "pagespec"; private String testScriptDir = "pageobj"; private String templatePath = "src/main/resources/TestScriptTemplate.xlsx"; private String caseNo = "001"; private String sheetName = "項目定義"; public static void main(String[] args) { PageSpecConverter converter = initInstance(); System.exit(converter.execute()); } public static PageSpecConverter initInstance() { ApplicationContext appCtx = new ClassPathXmlApplicationContext( "classpath:sit-wt-conf.xml","classpath:sit-wt-conv-pagespec-conf.xml"); return appCtx.getBean(PageSpecConverter.class); } public int execute() { File pagespecDirF = new File(pagespecDir); if (!pagespecDirF.exists()) { log.info("画面仕様書ディレクトリを作成します。{}", pagespecDirF.getAbsolutePath()); pagespecDirF.mkdirs(); } log.info("画面仕様書ディレクトリ以下のスクリプトを処理します。{}", pagespecDirF.getAbsolutePath()); for (File scriptFile : FileUtils.listFiles( pagespecDirF, fileFilter, DirectoryFileFilter.DIRECTORY)) { convert(scriptFile); } return 0; } /** * 画面定義書をテストスクリプトに変換します。 * * @param pageSpec 画面定義書 * @return テストスクリプト */ protected File convert(File pageSpec) { String pageSpecBaseName = FilenameUtils.getBaseName(pageSpec.getName()); String testScriptName = StringUtils.substringAfter(pageSpecBaseName, "_") + "TestScript.xlsx"; List pageItemSpeclist = loadPageSpec(pageSpec.getAbsolutePath(), sheetName); List testStepList = new ArrayList<>(); int no = 1; for (PageItemSpec pageItemSpec : pageItemSpeclist) { testStepList.add(convertPageItemSpec(no++, pageItemSpec)); } File testScript = new File(testScriptDir, testScriptName); dao.write(testScript, testStepList); return testScript; } /** * 画面定義書ファイルを読み込みます。 * * @param pageSpecPath 画面定義書のファイルパス * @param sheetName 項目定義のシート名 * @return 画面定義書 */ protected List loadPageSpec(String pageSpecPath, String sheetName) { List pageItemSpecList = new ArrayList(); DocumentMapper dm = appCtx.getBean(DocumentMapper.class); for (RowData row : repo.read(pageSpecPath, sheetName).getRows()) { PageItemSpec pageItemSpec = dm.map("pageItemSpec", row, PageItemSpec.class); pageItemSpecList.add(pageItemSpec); } return pageItemSpecList; } /** * 画面仕様書の1行をテストステップに変換します。 * * @param no テストステップNo * @param pageItemSpec 画面仕様書の1行 * @return テストステップ */ protected TestStep convertPageItemSpec(int no, PageItemSpec pageItemSpec) { TestStep testStep = new TestStep(); testStep.setNo(Integer.toString(no)); testStep.setCurrentCaseNo(caseNo); // 項目名 testStep.setItemName(pageItemSpec.getName()); // ロケーター Locator locator = buildLocator(pageItemSpec.getName(), pageItemSpec.getPname()); testStep.setLocator(locator); // 操作 String operationName = pageSpecConverterMap.get(pageItemSpec.getControl()); testStep.setOperationName(operationName); if ("click".equals(operationName)) { testStep.setScreenshotTiming("前"); } // ケースデータ Map testData = new HashMap(); testStep.setTestData(testData); // TODO セレクトボックスに対する操作でケースデータ"y"はテスト実行時にエラーとなる。 // これを避けるためにselect操作はスキップさせる。 String caseData = "select".equals(operationName) ? "" : "y"; testData.put(caseNo, caseData); return testStep; } protected Locator buildLocator(String name, String pName) { if (pName == null) { return Locator.build("id", name); } else { return Locator.build("id", pName); } } public TestScriptDao getDao() { return dao; } public void setDao(TestScriptDao dao) { this.dao = dao; } public DocumentRepository getRepo() { return repo; } public void setRepo(DocumentRepository repo) { this.repo = repo; } public Map getPageSpecConverterMap() { return pageSpecConverterMap; } public void setPageSpecConverterMap(Map pageSpecConverterMap) { this.pageSpecConverterMap = pageSpecConverterMap; } public String getPagespecDir() { return pagespecDir; } public void setPagespecDir(String pagespecDir) { this.pagespecDir = pagespecDir; } public String getTestScriptDir() { return testScriptDir; } public void setTestScriptDir(String testScriptDir) { this.testScriptDir = testScriptDir; } public String getTemplatePath() { return templatePath; } public void setTemplatePath(String templatePath) { this.templatePath = templatePath; } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.appCtx = applicationContext; } public IOFileFilter getFileFilter() { return fileFilter; } public void setFileFilter(IOFileFilter fileFilter) { this.fileFilter = fileFilter; } public String getCaseNo() { return caseNo; } public void setCaseNo(String caseNo) { this.caseNo = caseNo; } public String getSheetName() { return sheetName; } public void setSheetName(String sheetName) { this.sheetName = sheetName; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy