Selenium unittest测试执行顺序异常:登录测试先于页面标题测试执行的问题求助
问题根源与解决方案
嘿,我来帮你理清这个问题!你遇到的测试顺序颠倒的情况,其实和Selenium没关系,问题出在Python的unittest框架默认的执行规则上:
unittest会自动收集所有测试用例,然后按照测试类和测试方法的名称字母顺序来执行,而不是你在代码里定义它们的顺序。
看你的两个类:LoginTestButton和LoginTestTitle,字母表中"B"在"T"前面,所以框架会先执行LoginTestButton的测试,再执行LoginTestTitle的,这就是为什么你看到登录操作先跑,再检查标题。
几种解决方法
1. 修改类名/方法名(最简单的临时方案)
给测试类或方法的名称加上前缀,让字母顺序符合你的预期。比如:
- 把标题测试类改成
LoginTest01_Title - 把登录测试类改成
LoginTest02_Button
这样框架按字母排序时,01会排在02前面,就能先执行标题测试了。
2. 手动构建测试套件(最可控的方案)
自己创建测试套件,手动指定测试的执行顺序,完全不受命名影响。在你的测试代码末尾加上这段:
if __name__ == '__main__': # 创建测试套件 test_suite = unittest.TestSuite() # 按你想要的顺序添加测试用例 test_suite.addTest(LoginTestTitle('test_title')) test_suite.addTest(LoginTestButton('test_outthin_button')) # 运行测试套件 runner = unittest.TextTestRunner(verbosity=2) runner.run(test_suite)
这样运行时就会严格按照你添加的顺序执行测试。
3. 切换到pytest框架(更灵活的长期方案)
如果可以改用pytest(很多Python测试场景更推荐它),可以用pytest-ordering插件来给测试指定顺序:
- 安装插件:
pip install pytest-ordering - 给测试方法加装饰器:
import pytest class LoginTestTitle: @pytest.mark.order(1) def test_title(self): # 你的测试代码 class LoginTestButton: @pytest.mark.order(2) def test_outthin_button(self): # 你的测试代码
这样就能精准控制测试的执行顺序了。
额外小建议
你提到每个测试都会打开新浏览器窗口,这是因为unittest的setUp方法会在每个测试方法执行前都运行一次。如果想让多个测试共享同一个浏览器会话,可以改用setUpClass(类级别的初始化,整个测试类只执行一次):
class LoginTestTitle(unittest.TestCase): @classmethod def setUpClass(cls): path = "/Users/Users/Desktop/ChromeWebDriver/chromedriver" cls.driver = webdriver.Chrome(path) cls.driver.get("<link-to-webpage>") @classmethod def tearDownClass(cls): cls.driver.quit()
这样整个类的测试方法会共用同一个浏览器实例,不用每次都打开新窗口啦。
内容的提问来源于stack exchange,提问作者Nayden Van
相关产品推荐
相关产品推荐

