반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리


반응형

이번 더불어 민주당에서 영입된 인재들의 강연.

뭔가 정치인의 언어가 아닌 우리와 좀 더 가까운 언어를 사용하는 것 같다.

그래서 좀 더 우리의 문제를 알아 줄 것 같고 우리에게 도움이 되는 정치를 할 것 같다.

이런 사람들이 계속 정치를 하면 정말 좋겠다....


1. 김빈 디자이너 : 강연 내용 쩝니다. 말씀도 정말 설득력 있게 잘 하시고.. Two Thumbs up.




2. 웹젠 의장 김병관 : 집에서 맨날 게임 그만 하라고 그러는데 게임 좋다고 해서 좋다.. ^^




3. 표창원 교수: 정의를 고민하는 보수. 에너지 넘치고 시원시원한 .....




4. 양향자 삼성 상무 :삼성 임원인데도 친근감 가는 모습...




이런분들이 계속 정치를 하셨으면 좋겠습니다.


반응형

Test Module in Rally

2016. 1. 13. 06:48 | Posted by 솔웅


반응형

그동안 우리 팀에서 Agile 프로젝트 관리를 위해 Rally를 써 왔고 매뉴얼 테스트 케이스와 Defect 관리를 위해서는 HP ALM 을 써 왔습니다.

그런데 조금 변화가 생겨서 ALM을 사용하지 않게 되었어요.

그래서 Rally에 있는 Test에 관련된 Module 에 대해 Research 해 봤습니다.

그동안 Rally가 다른 회사로 넘어가서 공식적으로는 CA Technology 라고 이름이 바뀌었나 봅니다.


CA Agile Central Quality Manager Overview


Agile development는 테스터의 작업 방식을 획기적으로 변화시켰다. Agile 팀 내에서 아주 긴밀한 협력을 기반으로 테스트를 진행하게 된 것이다. 요구조건과 어플리케이션의 코드가 끊임없이 변화하기 때문에 테스터는 이에 맞게 팀 내에서 그 역할을 해야 한다. CA Agile Central은 소프트웨어 테스트 엔지니어에게 테스트 결과를 개발 lifecycle이 단계에 맞게 제공할 수 있는 tracking tool을 선사한다. 또한 다양한 automated software 테스팅 툴들과 같이 사용할 수 있도록 하는 기능도 제공한다.

CA Agile Central의 기본적인 테스트 기능들은 아래와 같다.

* User Story와 Defect 에 곧바로 테스트 케이스를 생성할 수 있도록 한다.
* 코딩 진행 단계에 맞춰 동시에 테스트가 진행 될 수 있도록 한다.
* View status dashboards that automatically group test case results by user stories to assess quality and readiness
* failing test case에 대한 좀 더 개선된 communication과 쉬운 defect re-creation 기능을 제공하고 이를 관리하는데 들어가는 burden들을 줄여준다.

그 외에 CA Agile Central Quality Manager 모듈의 추가적인 기능들은 Test Sets, Test Plan, Test Case Summary Page 등이 있다. 이 기능들은 아래와 같은 편의성을 제공한다.

* 시스템의 life 기간동안 여러번 반복되서 실행될 Regression test에 대한 관리
* 특정 criteria에 대한 custom test plan list를 생성
* Test Case summary page에서 iteration과 release 이외의 조건으로 쉽게 filtering 할 수 있음   



Quality management concepts





Basic Concepts :
Test Case : 테스트 케이스는 work item (US/Defect)를 기반으로 생성해서 그 work item 의 기능에 대해 검증할 수 있도록 한다. 테스트 케이스는 테스트 결과들을 만들어 낸다.
Test Folder : 테스트 폴더는 테스트 케이스를 organizing 하는 기본적인 메카니즘이다. 기본적으로 비슷한 기능들끼리 구성한다. 하나의 테스트 케이스는 하나의 테스트 폴더에 속할 수 있다.
Test Set : 테스트 세트는 테스트 케이스들의 모음이다. (테스트 폴더에 보관할 수도 있다.) 테스트 세트는 iteration이나 release 진행시 regression test 를 그룹화하고 일정을 정하는데 사용할 수 있다. 테스트 세트는 Iteration 과 Release Status 에서만 생성하고 사용될 수 있다. 테스트 세트를 복사해서 다른 iteration이나 release에 옮길 수 있다.




Life of a Test Case

1. 유저스토리나 defect 에 연계된 새로운 테스트 케이스를 생성한다. 테스트 케이스는 stand alone이 될 수도 있지만 권장하는 것은 아니다.
2. 테스터는 테스트를 진행하고 acceptable한지 여부를 결정한다. 이 테스트 케이스가 regression testing 에도 사용되어야 하면 다음 단계를 진행한다.
3. Optional : 테스트 케이스를 테스트 폴더에 넣는다. 테스트 폴더에는 관련된 테스트 케이스들이 있게 된다. 테스트 폴더는 테스트 케이스들을 organize 하도록 해 준다.
4. 이제 테스트 케이스는 많은 Regression test들 중의 하나이다. 이것은 test set 로 같이 schedule 되서 진행할 수 있다. 테스트 세트는 iteration 이나 release 와 연계돼 있다.



Related CA Agile Central Pages

Test Plan Page


이 페이지는 폴더 안에서 테스트 케이스들을 organize 하고 관리할 수 있도록 해 준다. 테스트 계획을 세울 때 폴더 안에 hierarchy 구조로 테스트 케이스들을 구성하고 싶다면 이 Test Plan 을 이용하면 된다. 테스트 폴더 안에서 테스트 케이스들을 Rank 하고 그룹 내의 테스트들을 run 하고 test resuts 와 Defect 들을 등록할 수 있다. 그리고 summarized result도 확인 할 수 있다.



Test Plan 페이지에 새로운 테스트 폴더가 생성되면 테스트 폴더는 현재의 scope (project)에 등록된다. 위 예제를 보면 이 테스트 폴더들은 Shopping Team 에 속하게 된다. 만약 테스트 폴더들을 다른 팀의 테스터들과 같이 공유하고 싶다면 좀 더 higher node 에 테스트 폴더를 associate 하면 된다.




Iteration Status Page

테스트 세트는 테스트 케이스들이 들어가는 공간이다. 이 테스트 세트는 특정 iteration 이나 release 에 처리할 테스트 케이스들을 포함하게 된다. Track -> Iteration Status 페이지에서 Add New 버튼을 누르고 드롭다운 메뉴에서 Test Set를 선택한다.




아래 내용을 참조할 것

* CA Agile Central Quality Manager 모듈은 테스트 세트, 테스트 플랜 페이지 그리고 Test Case summary page 가 구성돼 있어야 한다.
* passing, failing 혹은 pending 상태인 테스트 케이스들의 숫자등을 볼 수 있을 것이다. 그리고 test coverage의 상태를 표시하는 report와 dashboard들도 표시된다.
* CA Agile Central App SDK Toolkit을 사용해서 custom App 이나 custom report를 생성할 수 있다. 이것은 3rd-party testing system에서 CA Agile Central 에 integrate 되서 작동한다.


이 외에 관련된 글은 아래와 같다.


Test Plan
https://help.rallydev.com/managing-test-plans

Test Cases
https://help.rallydev.com/manage-test-cases

Test Set
https://help.rallydev.com/content/test-set

Test Case Results

https://help.rallydev.com/test-case-results

Test Runs
https://help.rallydev.com/test-runs

반응형


반응형

Getting Started with Apache Cassandra and Java (Part II)

  By Rebecca Mills, Junior Apache Cassandra Evangelist (@RebccaMills)



Requirements

이 강좌를 따라하시려면 Cassandra instance를 이미 가동한 상태여야 합니다. (작은 클러스터면 더 좋습니다.) Datastax Java Driver 도 인스톨 하세요. (refer to Part 1), 그리고 다음 10분 강좌를 마치시면 좋습니다.
http://www.PlanetCassandra.org/try-cassandra


Try it out

이 예제는 간단한 console application을 만드는 겁니다. Part 1 에서 이미 기본적인것은 다 완료 됐습니다. 이 글에서는 connection policies, prepared statements 그리고 query builder 등에 대해서 알아보겠습니다. 텍스트 에디터를 열어서 sinble main method 가 있는 이름이 GettingStartedTwo 인 클래스를 생성하세요.


public class GettingStartedTwo {

public static void main(String[] args) {

        Cluster cluster;
        Session session;
        ResultSet results;
        Row rows;

이제 cluster에 접속하고 session instance를 생성하겠습니다.

// Connect to the cluster and keyspace "demo"
Cluster cluster = Cluster.builder()
                  .addContactPoint("localhost")
                  .build();
Session session = cluster.connect("demo");


여기서 single instance 대신에 cluster 를 실행하겠습니다. 실패할 경우를 대비해서 적당한 장소에 safeguard를 넣겠습니다. 이 작업은 RetryPolicy 를 사용해서 할 겁니다. retry policy 는 시간이 초과되거나 node 접속이 가능하지 않을 때 반응할 수 있는 디폴트 behavior 가 가능하도록 합니다. DefaultRetryPolicy 를 사용하면 디폴트를 사용합니다.

    * read 시 여러번 반복했지만 데이터를 받지 못할 때

    * write 시 정해진 시간안에 batch statements에 의해 사용되는 log 를 writing 하는게 완료되지 않을 때

cluster = Cluster
    .builder()
    .addContactPoint("192.168.0.30")
    .withRetryPolicy(DefaultRetryPolicy.INSTANCE)
    .build();
session = cluster.connect("demo");

load balancing policy는 어떤 node 가 해당 쿼리에 대해 반응하고 작동할 것인가를 결정해 줍니다. client 는 어떤 node 에서도 read 와 write를 할 수 있습니다. 이것이 어떤 경우에는 효율적이지 않을 수 있습니다. 만약에 어떤 node 가 다른 node에서 가능한 read나 write를 하라는 요청을 받았다면 그 노드는 해당 요청에 대해 처리될 수 있도록 추가 작업이 필요합니다. 이런 경우를 다루기 위해 load balancing을 사용할 수 있습니다. TokenAwarePolicy 는 해당 요청이 primary key에 의해 지정된 data에 대해 해당 node로 가던가 아니면 요청을 적당한 노드로 복제하던가 하는 작업을 하게 될 겁니다. TokenAwarePolicy 를 사용할 때 DCAwareRoundRobinPolicy 를 사용하고 있는데요. 이는 그 요청이 local datacenter에서 수행될 수 있도록 관리하게 됩니다. 지금 현재 우리는 하나의 local cluster 만 가지고 있지만 그 다음 단계인 multi-datacenter 로 확장하게 될 경우 이러한 기능을 사용하는 것은 아주 바람직한 방법이라고 할 수 있습니다.

cluster = Cluster
        .builder()
        .addContactPoint("192.168.0.30")
        .withRetryPolicy(DefaultRetryPolicy.INSTANCE)
        .withLoadBalancingPolicy(
                         new TokenAwarePolicy(new DCAwareRoundRobinPolicy()))
        .build();
session = cluster.connect("demo");




이제 demo 키스페이스에 연결 됐습니다. users 테이블에 user를 입력해 봅시다. Part 1 에서 이미 다뤘던 내용입니다. 여기서는 Part 1과는 약간 다른 방법을 사용할 건데요. prepared statement를 사용할 겁니다. 이는 데이터베이스에 데이터를 넣고 뺄 때 좀 더 scure 하고 더 좋은 performance를 보여줄겁니다. Prepared statement는 cluster에 의해 한번만 parse 되어야 합니다. 그리고 나서 쿼리가 변수에 대입되고 그 변수를 이용해서 해당 쿼리 (statement)를 실행해서 cluster로부터 데이터를 읽고 쓰게 됩니다.


// Insert one record into the users table
        PreparedStatement statement = session.prepare(

        "INSERT INTO users" + "(lastname, age, city, email, firstname)"
                + "VALUES (?,?,?,?,?);");

        BoundStatement boundStatement = new BoundStatement(statement);

        session.execute(boundStatement.bind("Jones", 35, "Austin",
                "bob@example.com", "Bob"));


Java driver를 사용하면 쉽게 해당 user를 다시 받을 수 있습니다. Part 1에서는 CQL의 string representation을 사용했었습니다. 여기서는 같은 것을 Query Builder로 할 겁니다. 이 방법은 잠재적인 CQL injection attack에 대해 좀 더 secure 한 방법으로 그 위험성을 없앨수 있는 방법입니다.


// Use select to get the user we just entered
        Statement select = QueryBuilder.select().all().from("demo", "users")
                .where(eq("lastname", "Jones"));
        results = session.execute(select);
        for (Row row : results) {
            System.out.format("%s %d \n", row.getString("firstname"),
                    row.getInt("age"));
        }

이제 Bob의 생일이니까 나이를 한살 더 올리는 update를 실행하겠습니다.

// Update the same user with a new age
        Statement update = QueryBuilder.update("demo", "users")
                .with(QueryBuilder.set("age", 36))
                .where((QueryBuilder.eq("lastname", "Jones")));
                        session.execute(update);
// Select and show the change
        select = QueryBuilder.select().all().from("demo", "users")
                .where(eq("lastname", "Jones"));
        results = session.execute(select);
        for (Row row : results) {
            System.out.format("%s %d \n", row.getString("firstname"),
                    row.getInt("age"));


                    이제 테이블에서 Bob을 delete 합시다. 그리고 나서 users 테이블에 있는 남아있는 데이터를 모두 print 하겠습니다. Bob의 정보는 delete 됐으니까 더이상 볼 수 없을 겁니다. (이외에 다른 정보가 이전에 입력돼 있다면 그 정보는 보여질 겁니다.)

// Delete the user from the users table
           Statement delete = QueryBuilder.delete().from("users")
                .where(QueryBuilder.eq("lastname", "Jones"));
        results = session.execute(delete);
        // Show that the user is gone
           select = QueryBuilder.select().all().from("demo", "users");
        results = session.execute(select);
        for (Row row : results) {
            System.out.format("%s %d %s %s %s\n", row.getString("lastname"),
                    row.getInt("age"), row.getString("city"),
                    row.getString("email"), row.getString("firstname"));
        }

작업이 끝나면 반드시 connection을 끊어 주세요.

// Clean up the connection by closing it
cluster.close();
    }
}




CQL은 SQL 과 아주 유사합니다. 대부분의 SQL syntax가 CQL에서도 사용됩니다. 만역 관계형 데이터베이스에 대한 사전 지식이 있다면 데이터에 대한 쿼리를 이해하시기 쉬울 겁니다.

이제 Cassandra cluster에 연결하고 데이터베이스에 대해 쿼리를 실행시키면서 관리하는 방법을 배웠습니다. 이 글을 통해 Java Driver를 사용해서 Cassandra를 사용하는 것이 얼마나 쉬운일인지 이해하셨으면 합니다. 전체 console application 에 대한 샘플 코드는 이곳에서 받으실 수 있습니다.

반응형


반응형


Getting Started with Apache Cassandra and Java (Part I)

By Rebecca Mills, Apache Cassandra Junior Evangelist (@rebccamills)




이 강좌를 따라하시려면 Cassandra instance를 이미 가동한 상태여야 합니다. 그리고 다음 10분 강좌를 마치시면 좋습니다.
http://www.PlanetCassandra.org/try-cassandra

Part 1을 이미 보셨다면 그 다음인 Part 2를 보세요. Getting Started with Apache Cassandra and Java Part II.

그리고 사용할 keyspace와 schema 를 만들어 두시고 아래 내용을 실습할 때 사용하세요.


 
Setup



우리는 이 내용을 배우기 위해 간단한 console 어플리케이션을 만들 겁니다. 텍스트 에디터를 여시고 클래스 이름이 GettingStarted 라는 single main method를 가지는 자바파일을 생성하세요.

public class GettingStarted {

        public static void main(String[] args) {

그리고 다운로드 페이지에서 driver jar 파일을 다운로드 받습니다. 다운 받으시려면 여기를 누르세요. 다운 받은 후엔 이것을 여러분의 작업 directory에 expand 하세요. 이렇게 하면 자바파일을 컴파일 할 때 classpath 에 이것을 포하게 됩니다.

For example:
javac -classpath cassandra-java-driver-2.0.2/cassandra-driver-core-2.0.2.jar:. GettingStarted.java

  이 파일을 run 할 때에는 아래와 같이 하게 됩니다.
 
java -classpath cassandra-java-driver-2.0.2/*:cassandra-java-driver-2.0.2/lib/*:. GettingStarted



Try it Out

코딩은 main method에 할 겁니다. 우선 reference들을 hold 할 cluster 와 session instance 필드들을 생성해야 합니다. session은 cluster 에 대한 connection을 관리할 겁니다.

Cluster cluster;
Session session;

instance 에 연결하는 것은 Cluster.builder 메소드를 사용합니다. 여기에 contact point를 넣고 cluster instance를 build 할 겁니다. 해당 cluster로부터 session을 받은 다음 demo 라는 keyspace에 연결합니다.

// Connect to the cluster and keyspace "demo"
cluster = Cluster.builder().addContactPoint("127.0.0.1").build();
session = cluster.connect("demo");

이제 demo 라는 키스페이스에 연결 됐습니다. 이제 user를 users라는 테이블에 insert 해 보겠습니다.

// Insert one record into the users table
session.execute("INSERT INTO users (lastname, age, city, email, firstname) VALUES ('Jones', 35, 'Austin', 'bob@example.com', 'Bob')");

자바 드라이버를 사용해서 쉽게 그 user 정보를 다시 받아올 수 있습니다.

// Use select to get the user we just entered
ResultSet results = session.execute("SELECT * FROM users WHERE lastname='Jones'");
for (Row row : results) {
System.out.format("%s %d\n", row.getString("firstname"), row.getInt("age"));
}


Bob의 생일이니까 이제 Bob의 나이를 update 해 보겠습니다.

// Update the same user with a new age
session.execute("update users set age = 36 where lastname = 'Jones'");
// Select and show the change
results = session.execute("select * from users where lastname='Jones'");
for (Row row : results) {
System.out.format("%s %d\n", row.getString("firstname"), row.getInt("age"));

}

이제 테이블에서 Bob을 한번 지워 보겠습니다. 그리고 나서 모든 row를 print 합니다. delete 된 이후에는 Bob에 대한 정보를 볼 수 없게 될 겁니다. (이전에 정보가 입력돼 있다면 그 정보는 보실 수 있을 겁니다.)

// Delete the user from the users table
session.execute("DELETE FROM users WHERE lastname = 'Jones'");
// Show that the user is gone
results = session.execute("SELECT * FROM users");
for (Row row : results) {
System.out.format("%s %d %s %s %s\n", row.getString("lastname"), row.getInt("age"),  row.getString("city"), row.getString("email"), row.getString("firstname"));
}

모든 작업을 마치면 connection을 반드시 닫아 주세요.

// Clean up the connection by closing it
cluster.close();
    }
}




CQL은 SQL 과 아주 유사합니다. 대부분의 SQL syntax가 CQL에서도 사용됩니다. 만역 관계형 데이터베이스에 대한 사전 지식이 있다면 데이터에 대한 쿼리를 이해하시기 쉬울 겁니다.

이제 Cassandra cluster에 연결하고 데이터베이스에 대해 쿼리를 실행시키면서 관리하는 방법을 배웠습니다. 이 글을 통해 Java Driver를 사용해서 Cassandra를 사용하는 것이 얼마나 쉬운일인지 이해하셨으면 합니다. 전체 console application 에 대한 샘플 코드는 이곳에서 받으실 수 있습니다.

반응형
이전 1 다음