簡體   English   中英

Select 不同數據集測試時 | 將測試與生產分開

[英]Select different dataset when testing | Separate test from production

這個問題部分是關於如何測試外部依賴項(又名集成測試),部分是關於如何使用 Python 來實現它,因為 SQL 具體是 BigQuery。 因此,非常歡迎僅回答“這是您應該如何進行集成測試”的答案。

在我的項目中,我有兩個不同的數據集

'project_1.production.table_1'
'project_1.development.table_1'

在運行我的測試時,我想調用開發環境。 但是如何正確地將它與我的生產代碼分開,因為我不想將我的生產代碼與測試(設置)代碼混淆。

生產代碼如下所示:

def find_data(variable_x: string) -> DataFrame:
    query = '''
    SELECT *
    FROM `project_1.production.table_1` 
    WHERE foo = @variable_x
    '''

    job_config = bigquery.QueryJobConfig(
        query_parameters=[
            bigquery.ScalarQueryParameter(
                name='foo', type_="STRING", value=variable_x
            )
        ]
    )

    df = self.client.query(
        query=query, job_config=job_config).to_dataframe()
    return df

解決方案 1:數據集的環境變量

python-dotenv 模塊可用於區分生產和開發,就像我對代碼的某些部分所做的那樣。 問題是 bigQuery 不允許參數化數據集。 (為了防止 SQL 注入,我認為)請參閱運行參數化查詢文檔

從文檔

參數不能用作標識符、列名、表名或查詢的其他部分的替代品。

因此,將環境變量作為數據集名稱是不可能的。

方案二:流量控制的環境變量

我可以添加一個 if production == True 評估和 select 數據集。 但是,這會導致我的生產代碼中的測試/調試代碼。 我想盡可能地避免它。

from os import getenv

def find_data(variable_x : string) -> Dataframe:
   load_dotenv()
   PRODUCTION = getenv("PRODUCTION")
   if PRODUCTION == TRUE:
       *Execute query on project_1.production.table_1*
   else:
       *Execute query on project_1.development.table_1*
   job_config = (*snip*)
   df = (*snip*)
   return df

解決方案3:在測試代碼中模仿function

制作生產代碼的副本並設置測試代碼,以便調用開發數據集。

這會導致代碼重復(一個在生產代碼中,一個在測試代碼中)。 這種重復的結果會導致代碼的不匹配,可能隨着時間的推移function的執行發生變化。 所以我認為這個解決方案不是“擁抱變化”

解決方案 4:跳過測試此 function

也許這個 function 在我的測試代碼中根本不需要調用。 只需獲取此查詢結果的片段,並將結果用作“數據注入”到依賴此結果的測試中。 但是,我需要稍微調整一下我的架構。

上述解決方案並不能完全滿足我。 我想知道是否有另一種方法可以解決這個問題,或者上述解決方案之一是否可以接受?

看起來字符串格式(有時稱為字符串插值)可能足以讓您到達您想要的位置。 您可以用以下代碼替換 function 的第一部分:

query = '''
    SELECT *
    FROM `{table}` 
    WHERE foo = @variable_x
    '''.format(table = getenv("DATA_TABLE"))

這是有效的,因為查詢只是一個字符串,您可以在將它傳遞到 BigQuery 庫之前對它做任何您想做的事情。 String.format允許我們替換字符串中的值,這正是我們所需要的(有關String.format的更深入解釋,請參閱本文

重要的安全注意事項:通常將 SQL 查詢作為純字符串操作是一種不好的安全做法(正如我們在此處所做的那樣),但由於您控制應用程序的環境變量,因此在這種特殊情況下應該是安全的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM