2017-04-24 78 views
0

爲了提高應用程序質量,我正在測試:單元測試和UI測試。因爲我在應用程序中使用Dropbox支持,所以我想測試它,並且我需要在測試前驗證Dropbox帳戶(在我的Android應用程序中,用戶可以保存文件,讀取它們,重命名等 - 基本文件例程)。如何使用Dropbox Java/Android SDK v2自動進行身份驗證?

的Dropbox提供Java/Android SDK v2用的例子,但即使command-line tool需要一些手動操作 - 打開的瀏覽器應用程序的URL,並選擇帳戶:

// Run through Dropbox API authorization process 
     DbxRequestConfig requestConfig = new DbxRequestConfig("examples-authorize"); 
     DbxWebAuth webAuth = new DbxWebAuth(requestConfig, appInfo); 
     DbxWebAuth.Request webAuthRequest = DbxWebAuth.newRequestBuilder() 
      .withNoRedirect() 
      .build(); 

     String authorizeUrl = webAuth.authorize(webAuthRequest); 
     System.out.println("1. Go to " + authorizeUrl); 
     System.out.println("2. Click \"Allow\" (you might have to log in first)."); 
     System.out.println("3. Copy the authorization code."); 
     System.out.print("Enter the authorization code here: "); 

     String code = new BufferedReader(new InputStreamReader(System.in)).readLine(); 
     if (code == null) { 
      System.exit(1); return; 
     } 
     code = code.trim(); 

     DbxAuthFinish authFinish; 
     try { 
      authFinish = webAuth.finishFromCode(code); 
     } catch (DbxException ex) { 
      System.err.println("Error in DbxWebAuth.authorize: " + ex.getMessage()); 
      System.exit(1); return; 
     } 

     System.out.println("Authorization complete."); 
     System.out.println("- User ID: " + authFinish.getUserId()); 
     System.out.println("- Access Token: " + authFinish.getAccessToken()); 

任何可能性使Dropbox的身份驗證自動無需進行人工干預?我期望提供應用密鑰/祕密,帳戶電子郵件/密碼,並獲得會話accessToken

PS。我想避免使用Robelectric + Espresso並將其保留在單元/集成測試中,而不是在UI測試中。

回答

0

這是我的測試模板(我希望它有助於某人)。 您必須執行TODO並至少手動運行測試兩次(以粘貼授權碼和訪問令牌),然後您可以執行測試。所有下一個測試調用都不需要手動執行任何操作。

public class DropboxFileSystemTest { 

    // credentials 
    private static final String APP_KEY = ""; // TODO : paste your app key 
    private static final String APP_SECRET = ""; // TODO : paste your app secret 

    // do run the test and follow the instructions 
    private static final String accountEmail = "[email protected]"; // TODO : paste your test Dropbox account 
    private static String authCode; // TODO : run the test and paste auth code 
    private static String accessToken // TODO : run the test and paste access 

    private DbxAppInfo appInfo = new DbxAppInfo(APP_KEY, APP_SECRET); 

    // Run through Dropbox API authorization process 
    private DbxRequestConfig requestConfig = new DbxRequestConfig(DropboxFileSystemTest.class.getSimpleName()); 
    private DbxWebAuth webAuth = new DbxWebAuth(requestConfig, appInfo); 

    private void startAuth() throws IOException { 
     DbxWebAuth.Request webAuthRequest = DbxWebAuth.newRequestBuilder() 
      .withNoRedirect() 
      .build(); 

     String authorizeUrl = webAuth.authorize(webAuthRequest); 
     System.out.println("1. Go to " + authorizeUrl); 
     System.out.println("2. Click \"Allow\" (you might have to log in first). WARNING: log-in to " + accountEmail); 
     System.out.println("3. Copy the authorization code."); 
     System.out.println("4. Paste the authorization code to this test `this.authCode` value"); 
     System.out.println("5. Re-run the test"); 
    } 

    private DbxClientV2 client; // to be used for the requests 

    private void initWithAccessToken() { 
     DbxRequestConfig config = new DbxRequestConfig(UUID.randomUUID().toString()); 
     client = new DbxClientV2(config, accessToken); 
    } 

    private void initAndVerifyAccount() throws DbxException { 
     initWithAccessToken(); 

     // check expected account (trying to prevent user account to be wiped out) 
     DbxClientV2 client = DbxClientHolder.get().getClient(); 
     FullAccount account = client.users().getCurrentAccount(); 
     if (!account.getEmail().equals(accountEmail)) 
      throw new RuntimeException("Wrong account: current is " + account.getEmail() + ", but " + accountEmail + " is expected"); 
    } 

    private void clearFileSystem() throws FileSystemException { 
     // TODO : clear Dropbox file system 
    } 

    @Before 
    public void setUp() throws IOException, FileSystemException, DbxException { 
     auth(); 
     clearFileSystem(); 
    } 

    private void finishAuth() { 
     DbxAuthFinish authFinish; 
     try { 
      authFinish = webAuth.finishFromCode(authCode); 
     } catch (DbxException ex) { 
      System.err.println("Error in DbxWebAuth.authorize: " + ex.getMessage()); 
      System.exit(1); return; 
     } 

     System.out.println("Authorization complete."); 
     System.out.println("- User ID: " + authFinish.getUserId()); 
     System.out.println("- Access Token: " + authFinish.getAccessToken()); 
     System.out.println(); 

     System.out.println("1. Copy the access token"); 
     System.out.println("2. Paste the access token to this test `this.accessToken` value"); 
     System.out.println("3. Re-run the test"); 

     accessToken = authFinish.getAccessToken(); 
    } 

    private void auth() throws IOException, FileSystemException, DbxException { 
     if (accessToken == null) { 
      if (authCode != null) { 
       finishAuth(); 
       throw new RuntimeException("Manual actions required: copy-paste access token"); 
      } else { 
       startAuth(); 
       throw new RuntimeException("Manual actions required: copy-paste authCode"); 
      } 
     } else { 
      initAndVerifyAccount(); 
     } 
    } 

    @After 
    public void tearDown() throws FileSystemException { 
     if (client != null) { 
      clearFileSystem(); 
     } 
    } 

    @Test 
    public void testSmth() { 
     // TODO : write your test using `this.client` for requests 
    } 
1

不,Dropbox API不提供自動執行應用程序授權流程的方法。

請注意,您可以存儲並重新使用訪問令牌,因此您可能只需手動爲測試帳戶獲取一個,然後重新使用它。

+0

是與應用程序包相關的訪問令牌嗎?我想知道爲我的產品應用程序接收的訪問令牌是否會被單元測試接受 – 4ntoine

+0

Dropbox API訪問令牌僅標識應用程序用戶對。它不受限於特定的Java/Android包,因此您可以在多個位置/環境中使用相同的訪問令牌。 – Greg

相關問題