2013-03-19 33 views
6

Tôi có một dự án Java có chứa các bài kiểm tra junit cần chạy trên các môi trường thử nghiệm khác nhau (Dev, Staging, vv) thông qua Jenkins.Maven, Jenkins - làm thế nào để xây dựng dự án cho các môi trường thử nghiệm khác nhau?

Làm cách nào tôi có thể thiết lập việc xây dựng dự án cho các môi trường khác nhau và cách chuyển url, tên người dùng và mật khẩu cho maven?

Tôi có thể sử dụng 3 tiểu sử maven để đọc url môi trường, tên người dùng và mật khẩu từ tệp thuộc tính không?

Edit: Tôi đã thêm các cấu hình cho POM dự án:

<profiles> 
     <profile> 
      <id>Integration</id> 
     </profile> 
     <profile> 
      <id>Staging</id> 
     </profile> 
     <profile> 
      <id>PP1</id> 
     </profile> 
     <profile> 
      <id>PP2</id> 
     </profile> 
     <profile> 
      <id>PP3</id> 
     </profile> 
</profiles> 

Làm thế nào để vượt qua url, tên người dùng và mật khẩu để các cấu hình?

Hiện nay các thử nghiệm được thu thập các chi tiết môi trường thử nghiệm từ một tập tin bất động sản:

public class BoGeneralTest extends TestCase { 

    protected WebDriver driver; 
    protected BoHomePage boHomePage; 
    protected static Properties systemProps; 
    String url = systemProps.getProperty("Url"); 
    String username = systemProps.getProperty("Username"); 
    String password = systemProps.getProperty("Password"); 
    int defaultWaitTime = Integer.parseInt(systemProps.getProperty("waitTimeForElements")); 

    static { 
     systemProps = new Properties(); 
     try { 
      systemProps.load(new FileReader(new File("src/test/resources/environment.properties"))); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

Chỉnh sửa 2:

Sự thay đổi thực hiện trong lớp thử nghiệm Á hậu:

public class BoGeneralTest extends TestCase { 

    protected WebDriver driver; 
    protected BoHomePage boHomePage; 
    protected static Properties systemProps; 
    String url = systemProps.getProperty("Url"); 
    String username = systemProps.getProperty("Username"); 
    String password = systemProps.getProperty("Password"); 
    int defaultWaitTime = Integer.parseInt(systemProps.getProperty("waitTimeForElements")); 
    String regUsername = RandomStringUtils.randomAlphabetic(5); 

    final static String appConfigPath = System.getProperty("appConfig"); 

    static { 
     systemProps = new Properties(); 
     try { 

      systemProps.load(new FileReader(new File(appConfigPath))); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

Trả lời

4

Tôi sẽ không bao gồm bất kỳ thuộc tính nào trong POM nhưng sẽ sử dụng tệp thuộc tính bên ngoài cho mỗi môi trường thay thế, ít nhất thì bạn sẽ không cần chạm vào POM khi thuộc tính thay đổi.

Trong POM bạn chỉ định một hồ sơ mà tham chiếu một tập tin bất động sản với tài sản của bạn trong:

<profiles> 
    <profile> 
     <id>staging</id> 
     <properties> 
      <app.config>/your/path/to/app.staging.properties</app.config> 
     </properties> 
    </profile> 
</profile> 

Sau đó, bạn có thể chuyển thông tin này vào cấu hình chắc chắn bạn:

<plugins> 
    <plugin> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <configuration> 
      <systemPropertyVariables> 
       <appConfig>${app.config}</appConfig> 
      </systemPropertyVariables> 
     </configuration> 
    </plugin> 
</plugins> 

Từ bên trong bạn kiểm tra bạn có thể sau đó tải nội dung của tệp thuộc tính, ví dụ:

final String appConfigPath = System.getProperty("appConfig"); 
// Load properties etc... 

A ctually, bạn thực sự có thể thực hiện thêm một bước nữa ... đổ hoàn toàn các hồ sơ Maven và chỉ cần chỉ định -DappConfig=/your/path/to/app.staging.properties trong cấu hình xây dựng Jenkins của bạn.

+0

Cảm ơn bạn! Điều đó rất hữu ích. Bây giờ tôi đang đấu tranh để thay đổi mã để tải tập tin thuộc tính. Bất kỳ lời đề nghị sẽ được hoan nghênh: cung. –

+0

@AtanasKanchev Hãy xem [hướng dẫn này về tải thuộc tính] (http://docs.oracle.com/javase/tutorial/essential/environment/properties.html) cho một số gợi ý. Tôi hy vọng rằng sẽ giúp. :-) – Jonathan

+0

Cảm ơn Jonathan Tôi đã thực hiện phương pháp tiếp cận của bạn và nó hoạt động tốt. Có một nhược điểm mặc dù bây giờ các bài kiểm tra cá nhân không thể chạy riêng vì họ mong nhận được appConfig từ maven và tôi nhận được NullPointerException –

0

Bạn có thể thiết lập hồ sơ maven và chọn cấu hình nào đang hoạt động bằng cách sử dụng -P cờ

+0

Ok, tôi đã thêm các cấu hình sau để POM \t \t \t \t \t Integration \t \t \t \t \t \t \t Staging \t \t \t \t \t \t \t PP1 \t \t \t \t \t \t \t PP2 \t \t \t \t \t \t \t PP3 \t \t \t

0

Tại sao không sử dụng Maven build profiles, vì bạn có thể chỉ định <properties> cho mỗi cấu hình để xác định khác nhau build host vv Chỉ cần làm

$ mvn -Pstaging 

(tiếng nói) để cho phép hồ sơ cá nhân dàn.

Xem hướng dẫn sử dụng Sonatype trên Build Profiles để biết thêm thông tin.

+0

Làm thế nào để vượt qua các cấu hình để thử nghiệm junit - họ cần url môi trường, tên người dùng và mật khẩu –

0

Ở đây tôi sử dụng tập lệnh bash để triển khai tạo tác Jenkins cho Glassfish.

sudo /usr/share/glassfish3/glassfish/bin/asadmin --user admin --passwordfile /root/.asadminpass undeploy PROJECT_NAME 
sudo /usr/share/glassfish3/glassfish/bin/asadmin --user admin --passwordfile /root/.asadminpass deploy $WORKSPACE/PROJECT_NAME/target/PROJECT_NAME.war 
0

KHÔNG sử dụng Maven Build Profiles for this!

Nó buộc bạn phải thực sự thay đổi bản dựng của mình cho các môi trường khác nhau.

Thay vào đó, hãy thử nghiệm và có thể ứng dụng của bạn có thể định cấu hình. Ý tưởng cơ bản là đọc chi tiết cấu hình (ví dụ: url cơ sở dữ liệu) từ một số thuộc tính hệ thống. Điều này có thể dễ dàng được chỉ định trong các cấu hình công việc của Jenkins

Đối với các kịch bản phức tạp hơn, bạn có thể chỉ định các lớp được sử dụng cho mục đích cung cấp từ các thuộc tính hệ thống, ví dụ nếu bạn muốn MockedImplementation cho môi trường Dev và thực tế trong QA .

Nếu bạn tình cờ sử dụng Spring, hãy xem Hồ sơ mùa xuân, hỗ trợ loại nội dung này rất tốt.

Nếu bạn chỉ cần điều này trong các bài kiểm tra, bạn sẽ có thể đóng gói loại nội dung này trong Quy tắc JUnit.

+0

Tôi không chắc chắn về điều này. Tôi nghĩ rằng việc xây dựng bản thân có thể phụ thuộc vào các tập tin cấu hình. Có ai khác đồng ý không? – ecbrodie

Các vấn đề liên quan