亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python unittest正確設置全局變量

Python unittest正確設置全局變量

楊__羊羊 2022-11-01 16:09:04
我有一個簡單的方法,可以根據方法參數將全局變量設置為 True 或 False。這個全局變量被調用feedback并且有一個默認值False。當我調用setFeedback('y')全局變量時,將更改為feedback = True. 當我調用setFeedback('n')全局變量時,將更改為feedback = False.現在我正在嘗試在 Python 中使用 unittest 進行測試:class TestMain(unittest.TestCase):    def test_setFeedback(self):        self.assertFalse(feedback)        setFeedback('y')        self.assertTrue(feedback)當我運行此測試時,我收到以下錯誤:AssertionError: False is not true.由于我知道該方法可以正常工作,因此我假設全局變量以某種方式被重置。但是,由于我對 Python 環境還很陌生,所以我不知道自己做錯了什么。我已經在這里閱讀了一篇關于 mocking 的文章,但是由于我的方法更改了一個全局變量,我不知道 mocking 是否可以解決這個問題。我將不勝感激。這是代碼:主要.py:#IMPORTSfrom colorama import init, Fore, Back, Stylefrom typing import List, Tuple#GLOBAL VARIABLEfeedback = False#SET FEEDBACK METHODdef setFeedback(feedbackInput):    """This methods sets the feedback variable according to the given parameter.       Feedback can be either enabled or disabled.    Arguments:        feedbackInput {str} -- The feedback input from the user. Values = {'y', 'n'}    """    #* ACCESS TO GLOBAL VARIABLES    global feedback    #* SET FEEDBACK VALUE    # Set global variable according to the input    if(feedbackInput == 'y'):        feedback = True        print("\nFeedback:" + Fore.GREEN + " ENABLED\n" + Style.RESET_ALL)        input("Press any key to continue...")        # Clear the console        clearConsole()    else:        print("\nFeedback:" + Fore.GREEN + " DISABLED\n" + Style.RESET_ALL)        input("Press any key to continue...")        # Clear the console        clearConsole()test_main.py:import unittestfrom main import *class TestMain(unittest.TestCase):    def test_setFeedback(self):        self.assertFalse(feedback)        setFeedback('y')        self.assertTrue(feedback)if __name__ == '__main__':    unittest.main()
查看完整描述

2 回答

?
千巷貓影

TA貢獻1829條經驗 獲得超7個贊

你的測試有兩個問題。

首先,你input在你的feedback函數中使用,這將停止測試,直到你輸入一個鍵。你可能應該嘲笑input. 此外,您可能會認為調用input不屬于setFeedback(參見@chepner 的評論)。

其次,from main import *在這里不起作用(除了樣式不好),因為這樣您在測試模塊中創建全局變量的副本 - 變量本身的更改不會傳播到副本。您應該改為導入模塊,以便訪問模塊中的變量。

第三(這取自@chepner 的答案,我錯過了),您必須確保變量在測試開始時處于已知狀態。

這是應該工作的:

import unittest

from unittest import mock


import main  # importing the module lets you access the original global variable



class TestMain(unittest.TestCase):


    def setUp(self):

        main.feedback = False  # make sure the state is defined at test start


    @mock.patch('main.input')  # patch input to run the test w/o user interaction

    def test_setFeedback(self, mock_input):

        self.assertFalse(main.feedback)

        main.setFeedback('y')

        self.assertTrue(main.feedback)


查看完整回答
反對 回復 2022-11-01
?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

你不需要嘲笑任何東西;您只需要在運行每個測試之前確保全局變量處于已知狀態即可。此外, using在您的測試模塊中from main import *創建一個新的全局命名,與修改不同。feedbackmain.feedbacksetFeedback


import main


class TestMain(unittest.TestCase):


    def setUp(self):

        main.feedback = False


    def test_setFeedback(self):


        self.assertFalse(feedback)

        main.setFeedback('y')

        self.assertTrue(feedback)


查看完整回答
反對 回復 2022-11-01
  • 2 回答
  • 0 關注
  • 328 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號