'Databene Benerator'에 해당되는 글 1건

  1. 2013.02.19 자동 테스트 데이터 생성 오픈소스, Databene Benerator
IT/오픈소스2013. 2. 19. 11:07

현재 수행하고 있는 프로젝트에 임의의 테이블을 만들고 데이터를 300만건을 만들려고 한다. 물론 의미있는 데이터 필요는 없지만 구색은 맞추었으면 한다. 이걸 엑셀과 VBA 사용해서 만들어볼까하다가 구글링을 혹시나 해보았다. 그런데 Data Generate 해주는 툴이 있는게 아닌가,,

이름하여, Databene Benerator이다. 

아주 오래전에 올라온 오픈소스인데 아직 버젼이 1.0 찍지는 못하였으나 리뷰를 보면 알다시피, 아는 사람은 계속 가지고 잘 사용하고 있다는 것을- 그리고 왠만한 데이터베이스와 호환이 된다. (내가 아는 데이터베이스가 많이 없어서 그럴수도 있다.)

사용법은 메뉴얼을 보면 머리가 보면 너무 복잡해지고 알아될 그 프로그램만의 용어, 그리고 개념, 구조 등등 알아야 될게 많으니 간단히 설명을 하자.


우선, 준비는 다음과 같다.

1. 여기에서 다운로드를 받자. 참고로 최신 0.97버젼인데 독일회사인지로 바꼈다. 우선 txt로 된 파일을 받아 url의 주소를 가서 받도록 하자. (0.80 버젼은 아래에서 받자)

benerator-0.8.0.a01

benerator-0.8.0.a00

benerator-0.8.0.alz


2. 압축을 폴면 bin 폴더가 있고, demo 폴더가 있다. 두개 폴더만 보면 된다. 괜히 머리아프게 딴거 보지말자. bin은 실행, 환경설정 파일이 있는거고, demo는 이 프로그램을 쓰기 위한 예제가 있다. 셋팅할게 많으니 빠른 이해와 급적용 위해서는 예제 필수 ( 필자도 그리했슴 )

3. bin폴더는 classpath를 잡아줘서 어디서든 bin\benerator 명령이 먹히도록 하자. ( 한번 쓰고 말꺼면 몰라도)

위와 같이 shop폴더를 예제를 삼은 것은 이것만 보면 다른건 다 이해가 간다. 그리고 예제 업데이트가 안되서 다른 예제는 오류가 나는 경우가 있다. deprecated된것도 아니고 아예 기능을 뺀게 있어 xml 파싱을 하다가 나는 오류가 있으니 참고 필수임돠~

설명은 h2 database 기준으로 설명을 하겠어요.  

메인이 shop.ben.xml 파일이다. 이 xml을 가지고 실제 benerator가 작업을 다하기 때문에 이 xml 구조만 설명하면 거의 아신다고 해도 무방~

위치는  BENERATOR_HOME\demo\shop\shop.ben.xml 에 있으며, 주요 태그들의 설명은 다음과 같습니다.

 exectue

 attribute의 sql문을 직접 실행시키며, create,drop DDL문을 실행시켜 셋팅작업을 하는데 사용한다.

 setup

 root태그, xsi, xsd설정, 그대로 유지

 comment  말그대로 주석태그

 import

 domains, platforms를 import

 setting

 properties 설정

 include

 property files loading

 iterate

 file에서 data들을 읽어서 consumer에 저장 

 generate

 data 생성하는 부분

 id : column name  generator : data generation func지정

 reference : FK임을 지정 targetType(Fk 관계 있는대상 테이블)

 attribute : type별 특정 값 random 추출

 consumer : 해당 데이터를 fixed length등의 포멧지정으로 외부로 export

세부 설명은 PDF(여기)를 참조하도록 한다.


하나 예를 들면, 아래 예제에서 generate 태그 propety에 count는 생성할 데이터 건수를 3백만건으로 변경하고 싶으면 아래 소스중에 db_product를 generate하는 부분에 

count 태그의 값을 3000000으로 변경하면 3백만건의 데이터가 생성이 된다.


....

실행방법은

BENERATOR_HOME\bin\benerator.bat 해당경로의 shop.ben.xml 을 참조하면 되는데 이해를 돕기 위해서 execute.xml을 제가 따로 만들었습니다.


................

<?xml version="1.0" encoding="iso-8859-1"?>

<setup 

xmlns="http://databene.org/benerator/0.7.0"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://databene.org/benerator/0.7.0 http://databene.org/benerator-0.7.0.xsd">

 

 

<!-- 도메인 정의는 생략하기로 함 -->

<!-- <import domains   = "person,net,product" /> -->

<import platforms = "db"/>

<setting name="database" default="oracle" />

<setting name="dbCatalog"  default="" />  <!-- db catalog -->

<setting name="dbSchema"   default="" />     <!-- db schema -->

<setting name="dbPassword" default="manager" />  <!-- db password -->

<setting name="dbBatch"    default="false" />  <!-- db batch -->

<setting name="row_count"    default="3000" />   <!-- db 생성할 row 카운트  -->

<!--<setting name="stage" default="development" /> --> <!-- 생략 가능  -->


<comment>import stage and database specific properties</comment>

<include uri="{ftl:${database}/shop.${database}.properties}" /> 

<!-- ftl: is the prefix used for scripting with FreeMarker Template Language -->

<!--  <include uri="{ftl:shop.${stage}.properties}" /> -->


<!--  TODO use environment file -->

    <comment>define a database that will be referred by the id 'db' subsequently</comment>

    <database id="db" url="{dbUrl}" driver="{dbDriver}" catalog="{dbCatalog}" schema="{dbSchema}"

        user="{dbUser}" password="{dbPassword}" batch="{dbBatch}" />


<!--

<comment>drop the current tables/sequences if they exist and recreate them</comment>

<execute uri="{ftl:${database}/drop_tables.${database}.sql}"   target="db" onError="ignore" /> 

<execute uri="{ftl:${database}/create_tables.${database}.sql}" target="db" />

-->


<!-- ID GENERATOR 정의 -->

<bean id="idGen" spec="new IncrementGenerator(1000)" />

<bean id="idGen1" spec="new IncrementGenerator(1)" />

<bean id="idGen2" spec="new IncrementGenerator(1)" />



<comment>Creating a valid base data set for regression testing by importing a DbUnit file</comment>

<!--<iterate source="shop.dbunit.xml" consumer="db" />-->


<!--csv -->

<comment>Importing some more predefined products from a CSV file</comment>

<!--<iterate source="products.import.csv" type="db_product" encoding="utf-8" consumer="db" /> -->

<bean id="sg" class="SequenceTableGenerator">

<property name="database" ref="db"/>

<property name="table" value="SDM_DOCUMENT"/>

<property name="column" value="DOC_ID"/>

</bean>

 

<!-- generate -->

<generate type="SDM_DOCUMENT" count="{row_count}" consumer="db">

<id name="pjt_code" type="string" generator="new IncrementalIdGenerator(10000)" />

<id name="doc_id" type="string" generator="idGen" /> 

<attribute name="gepc_type_code" values="'1','2','3', '4'"/>

<attribute name="pbs_level1_code" values="'PM','PMO','PL'"/>

<attribute name="pbs_level2_code" values="'COM','CEE','CEB'"/>

<attribute name="doc_name" values="'Buried Telephone Cable Distribution Wire Installation Details','Standard Installation Telephone Pole Lines'" />

<id name="doc_no" generator="idGen2" />

<attribute name="doc_revision_no" values="'1','2','3', '4', '5'"/>

<attribute name="doc_status_code"  values="'1','2','3', '4', '5'" />

<attribute name="delete_yn" values="'y','n'" />

<attribute name="incharge_id" values="'byunghyun.yu', 'ds.lee', 'e.joe', 'sue.park'"/>

<attribute name="incharge_name" values="'y','n'"/>

<attribute name="security_level" values="'1','2','3', '4', '5'" />

<attribute name="doc_content" values="'aaaaa','bbbbb','cccccc'" />

<attribute name="deliverable_list_name" values="'aaa','bbbb','ccccc'" />

<attribute name="task_pjt_id" values="'13579'" />

<attribute name="task_id" values="'1','2','3','4','5','6','7','8','9','10'" />

<attribute name="create_dttm"  type="date" nullable="false" />

<attribute name="create_id" values="'byunghyun.yu', 'ds.lee', 'e.joe', 'sue.park'" />

<attribute name="update_dttm"  type="date" nullable="false" />

<attribute name="update_id" values="'byunghyun.yu', 'ds.lee', 'e.joe', 'sue.park'" /> 

</generate>

</setup>

................



이렇게 실행을 하면 자동으로 database를 connection하고 지정한 테이블들의 데이터를 자동으로 generate시킵니다.

 

 

*******************************************************************************************************************
 <comment>create order items</comment>
 <generate type="db_order_item"
   count="{customer_count * orders_per_customer * items_per_order}" consumer="db">
  <variable name="product" source="db" selector="select ean_code, price from db_product" distribution="cumulated" />
        <id name="id" generator="idGen" />
  <attribute name="number_of_items" min="1" max="27" distribution="cumulated" />
  <reference name="order_id" source="db" selector="select id from db_order where id &gt; 1" cyclic="true" />
  <reference name="product_ean_code" script="product[0]" />
  <attribute name="total_price" script="product[1] * db_order_item.number_of_items" />
 </generate>

 

*******************************************************************************************************************

 

 

'IT > 오픈소스' 카테고리의 다른 글

HornetQ vs ActiveMQ vs RabiitMQ  (0) 2013.04.18
Posted by 억사마