应用Python版本与pytest 3.4.2测试代码版本适配的技术咨询
Great question—let’s break this down to make sure you’ve got a clear path forward, especially with your planned Python 3.6 upgrade.
核心结论
Your test code doesn’t have to match your application code’s Python version exactly, but it must be compatible with the Python environment you’re running pytest in. Here’s the breakdown of what that means for your setup:
1. 当前Python 2.7.4环境下的测试
When you run pytest in your Python 2.7.4 setup, pytest uses the 2.7.4 interpreter to execute both your application code and your test code. That means:
- Your test files (like
test_mymodule.py) need to be compatible with Python 2.7. You can’t use Python 3-only syntax here (e.g., f-strings,async def, or unimportedprint()as a function). - That said, you can write test code that’s cross-compatible with both 2.7 and 3.6 right now. Using tools like the
sixorfuturelibraries, or sticking to syntax that works in both versions (e.g., usingrange()instead ofxrange(), since 3.6 doesn’t supportxrange()), will save you a ton of work when you upgrade later.
2. 未来升级到Python 3.6.x后的测试
Since pytest 3.4.x supports Python 3.3+, your cross-compatible test code will run seamlessly in the 3.6 environment. If you want to update your test code to use Python 3.6-specific features later (like f-strings or type hints), you can do that—just remember that those updated tests won’t work in Python 2.7 anymore (which won’t matter if you’ve fully migrated your application code to 3.6).
最佳实践
- Prioritize cross-compatible test code during your transition phase. This lets you run the same test suite in both 2.7 and 3.6 environments, ensuring your application behaves consistently as you migrate.
- Avoid version-specific syntax in tests unless you’re certain you’ll only run them in that environment. For example, don’t use
xrange()if you plan to run tests in 3.6, and don’t use f-strings if you still need to run tests in 2.7. - Use compatibility libraries like
sixto handle tricky cross-version differences (e.g., importing modules that have different paths in 2.7 vs 3.6) without cluttering your code.
内容的提问来源于Stack Exchange,提问作者Rajarathinam Chidambaram




