关于unittest继承类的问题


from selenium import webdriver
from selenium.webdriver.common.by import By
import unittest
class TestCase1(unittest.TestCase):
    def test_01(self):
        global driver
        #webdriver实例化
        driver = webdriver.Chrome()
        driver.get('https://www.baidu.com')
        driver.maximize_window()
        driver.find_element(by=By.ID,value='kw').send_keys('码上学院')
        driver.find_element(by=By.ID,value='su').click()
if __name__ == '__main__':
    print('11111111111111')
    unittest.main()

代码如上
在pycharm中,如果执行的时候是选择python,并且路径为此py文件对应的路径,那么会执行main,如果是python tests,那么不会执行main,我想问下这是什么 原因,有什么资料介绍嘛?
另外第二个问题,如果是执行main,为什么这里写成unittest.main也会执行test_01?我理解的是TestCase1这个类继承了unittest.TestCase,test_01的方法应该是这个类重写的,也是他独有的,不应该影响到父类啊,为什么这里调用父类会调用到这个方法,请知道的告诉下谢谢

第一个问题:

python向来就不是用if __name__ == '__main__'作为入口的,都是严格从上而下顺序执行的。只是恰好你run的文件,python会给他起一个名字,叫做__main__。你看是if __name__ == '__main__':,是个判断对吧,所以只有你直接run文件的时候才会执行“main”中的方法。
很多框架性的组件中,采取的是加载运行。就像Flaskdjangotornado等一系列框架,unitest也是类似。他们为了更好的支持扩展功能,比如说多线程、多进程、或者更好的监控和管理程序的运行,会有一个执行器。
也就是我们通常命令行运行的那个东西,也是你提到的python tests(本质上帮助你调用了一下命令行),然后用这个执行器来之行你的python代码。这样的话这个代码python就不管它叫__main__了。
你可以print(__name__)看一看它具体叫什么,一般来说会是你的模块名。
另外,有一些框架是动态加载类的,比如说debug框架pdb

第二个问题:

简单的说,运行unittest.main()的,实际上会获取你当前的python文件,然后会有一个加载器分析这个文件里面有没有它所期望的类(TestCase),如果有就加载进来。获取类的方法是根据后缀去匹配的,默认的后缀是test
如果希望更细致的了解可以点进去main(),然后设置断点逐步执行看到底做了些什么。
下面是unittest.main()中的几行:

        self.testRunner = testRunner # 设置runner
        self.testLoader = testLoader # 设置loader
        self.progName = os.path.basename(argv[0])
        self.parseArgs(argv) # 加载参数,其中会调用createTests方法,createTests方法就是Test类加载器。
        self.runTests() # 运行获取到的Test类,返回结果。

希望对你有帮助。