2014-03-25 52 views
0

我有下面的代碼,這段代碼應該通過測試,但如果我使用錯誤的憑據,它仍然通過測試,即使憑據不正確。登錄驗證?

我是新來硒webdriver的,我不知道什麼做錯了。

public class LoginTest { 

    String url ="jdbc:sqlserver://CODESV3;databaseName=Codes;integratedSecurity=true"; 
    String DBdriver ="com.microsoft.sqlserver.jdbc.SQLServerDriver"; 
    Connection conn = null; 
    WebDriver driver = null; 
    PreparedStatement pstmt=null; 
    ResultSet rs=null; 

    @BeforeTest 
    public void establishConn() 
    { 
     driver = new FirefoxDriver(); 
     driver.get("https://10.10.10.50/"); 
     // establish connection 
     try{ 
      Class.forName(DBdriver).newInstance(); 
      conn = DriverManager.getConnection(url); 
     }catch(Exception e){ 
      System.out.println("Database failed to connect "); 
     } 
    } 

    @Test 
    public void testLogin() 
    { 
     String forceID="1234"; 
     String username="ayaslem"; 
     String password="Delpiero10+"; 
     boolean valueFound=true; 
     // Check the db 
     try{ 
      pstmt=conn.prepareCall("select * from Login where ForceID=?, and Username=? and Password=?"); 
      pstmt.setString(1,forceID); 
      pstmt.setString(2,username); 
      pstmt.setString(3,password); 
      rs=pstmt.executeQuery(); 
      valueFound = rs.next(); 

     }catch(Exception e){ 
       // report some error 
     } 
     System.out.println(valueFound); 
     // login into app 
     driver.findElement(By.xpath("//*[@id='LogonModel_OrganisationName']")).sendKeys(forceID); 
     driver.findElement(By.xpath("//*[@id='LogonModel_UserId']")).sendKeys(username); 
     driver.findElement(By.xpath("//*[@id='LogonModel_Password']")).sendKeys(password); 
     driver.findElement(By.xpath("//*[@id='maincontent']/form/div/fieldset/div[4]/div[2]/input")).click(); 

     String actual_title = driver.getTitle(); 
     System.out.println(valueFound); 
     if(valueFound){ 
      Assert.assertEquals(actual_title,"Dashboard"); 
     }else{ 
      Assert.assertEquals(actual_title,"Logon"); 
     } 
    } 

    @AfterTest 
    public void closeConn() throws SQLException 
    { 
     if(conn!=null && !conn.isClosed()) 
     { 
      conn.close(); 
     } 
    } 
} 
+0

valueFound = rs.next();你確定rs.next()在未找到的查詢上返回false?在我的經驗,它將返回true上沒有發現 –

+0

rs.next檢查下一行,如果在數據庫中存在的憑據valueFound應該返回true,如果他們不存在valueFound應該返回false查詢一組0。 –

+0

我知道你是「想」做什麼,但rs.next()只有在查詢寫得不好(即語法錯誤)返回false它總是返回true,如果查詢是正確的(即使WHERE條件不滿意)。你的SELECT語句編寫正確,因此rs.next()返回true –

回答

0

只有2個斷言可能無法通過測試(除了拋出任何異常外)。所以我們只關注它們。

當您提供虛假的登錄名和密碼時,您的valueFound變量設置爲false,並在else塊之後,其中JUnit聲明webdriver是否仍在登錄站點上。由於您正在測試的Web應用程序很可能在使用虛假憑證登錄後停留在登錄頁面上,所以斷言傳遞(因爲它通過檢查頁面標題來檢查它是否仍然在登錄頁面上)。

當您提供正確的登錄名和密碼時,if條件通過,因爲valueFound在數據庫中找到此用戶後設置爲true,並繼續聲明Webapp是否將您重定向到儀表板頁面。

我覺得你的測試涵蓋這兩種情況不夠好,檢查應用程序保持與假數據當前頁面上,並檢查它是否導航期待與實際的數據中心頁面。在兩種情況下,都應該通過我的意見。

P.S.這裏有一個提示 - 你不需要在任何地方使用xpath。有專門的方法,如By#id(int),那裏是讓你的生活作爲自動化測試工程師更容易:)

此外,使用我所說的弱xpaths是一個非常糟糕的做法(//*[@id='maincontent']/form/div/fieldset/div[4]/div[2]/input)。如果頁面上的任何順序發生更改,或者任何元素都被包裝在中間div中,那麼xpath將找不到要查找的元素。向Webapp的開發人員詢問ID或名稱,或在表單容器元素上使用By#tagName("button")

+0

SYE,謝謝...這只是一個模擬例子,如果我的測試通過(行爲如我所料),然後我把它傳遞給驅動的框架我的數據。 –

+0

我相信它的行爲應該像正確測試應用程序一樣。除此之外,我做了一些解釋,說明爲什麼它通過這兩種情況。隨意接受答案,如果你發現它有幫助:) – Stye

+0

即使當我有錯誤的憑據,我不知道爲什麼,代碼傳遞。 –