V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
efaun
V2EX  ›  Python

Python 有像 Junit 一样可以执行部分代码的方法吗?

  •  
  •   efaun · 2020-07-27 14:39:53 +08:00 · 2468 次点击
    这是一个创建于 1607 天前的主题,其中的信息可能已经有所发展或是发生改变。
    背景:从 java 转 python 的初学者

    我想实现的目的是:



    在这三个方法中可以怎样选择性执行 one() or two() or three()?

    我百度了下,可以创建测试类,但是它会输出一个测试报告,且会进行断言,而我的目的不是进行单元测试,是要在一个 py 文件里单独执行不同的方法

    还可以在 pycharm 里使用 shift+alt+e 执行代码片段,但是我会些一些逻辑在里面,还有 import,这个方法也不行

    对比 java,有 junit 可以实现:



    可以分别执行这三个方法,那么轮子众多的 python 也一定有相应的方法才对,只是我没有找到,所以请教各位,我可以怎么做?
    第 1 条附言  ·  2020-07-27 15:33:14 +08:00
    感谢#10 和#11 帮我重新组织的语言

    [我想在 pycharm 里实现像 idea 里面一样,在一个函数旁边有个绿色三角,可以单独执行这某一个函数的方法]

    不过我想我的提问还是不够准确,等我再深入学习一段时间 python 再说吧,谢谢大家了
    第 2 条附言  ·  2020-07-27 17:36:30 +08:00
    感谢大家的热情回复~我决定再好好深入学习 python,已下沉本贴,再次感谢回复的各位🤝
    leishi1313
        1
    leishi1313  
       2020-07-27 15:05:17 +08:00 via Android
    XY 问题,虽然图和字不少,但还是没聊清楚你到底想要干什么
    LokiSharp
        2
    LokiSharp  
       2020-07-27 15:08:15 +08:00
    Google 搜索 “Python 单元测试”
    imn1
        3
    imn1  
       2020-07-27 15:08:45 +08:00
    弱弱地问一下,你见过这句吗?

    if __name__ == '__main__':
    efaun
        4
    efaun  
    OP
       2020-07-27 15:09:03 +08:00
    @leishi1313 #1 还不够清楚吗,

    在 python 里怎样选择性执行 one() or two() or three()?
    efaun
        5
    efaun  
    OP
       2020-07-27 15:09:41 +08:00
    @LokiSharp #2 已经说过了,它会输出一个测试报告,且会进行断言,而我的目的不是进行单元测试,是要在一个 py 文件里单独执行不同的方法
    wellsc
        6
    wellsc  
       2020-07-27 15:13:40 +08:00
    ```python
    def one_or_two_or_three():
    if one:
    one()
    elif two:
    two()
    else:
    three()

    one_or_two_or_three()
    ```
    这样?
    efaun
        7
    efaun  
    OP
       2020-07-27 15:13:55 +08:00
    @imn1 #3 这可以实现我文中的情况,但是更复杂的无法实现,一个 py 文件里十几个方法,虽然可以在选择性执行一个的时候来来回回注释其他的方法,但是这太麻烦了,更希望有 junit 一键执行的方法
    efaun
        8
    efaun  
    OP
       2020-07-27 15:13:59 +08:00 via Android
    @imn1 #3
    这可以实现我文中的情况,但是更复杂的无法实现,一个 py 文件里十几个方法,虽然可以在选择性执行一个的时候来来回回注释其他的方法,但是这太麻烦了,更希望有 junit 一键执行的方法
    GeruzoniAnsasu
        9
    GeruzoniAnsasu  
       2020-07-27 15:14:30 +08:00
    没人看得懂想问啥

    执行 one:

    one()

    (摊手)
    GeruzoniAnsasu
        10
    GeruzoniAnsasu  
       2020-07-27 15:15:45 +08:00   ❤️ 1
    看起来似乎在说 必须要在 ide 里自动给每个函数弄出一个绿色三角能点?
    leishi1313
        11
    leishi1313  
       2020-07-27 15:16:37 +08:00 via Android
    @efaun 那我帮你组织下语言,你想问的是,如何在 pycharm 里执行一个 Python 文件里的某个函数,对吗?
    efaun
        12
    efaun  
    OP
       2020-07-27 15:17:51 +08:00
    @wellsc #6 呃……我说的 or 是或的意思……就是执行其中一个的时候不会执行其他的
    efaun
        13
    efaun  
    OP
       2020-07-27 15:18:26 +08:00 via Android
    @GeruzoniAnsasu #10 @leishi1313 #11
    是的😂
    imn1
        14
    imn1  
       2020-07-27 15:18:32 +08:00
    if __name__ == '__main__':
    下面写你想运行的东西(调用上面的函数),例如
    one()
    three()
    two()
    然后单独运行这个 py,它只会执行这句后面的内容

    这句及下面的语句,在 import 时不执行,因为运行主体不是'__main__',所以没影响
    imn1
        15
    imn1  
       2020-07-27 15:20:55 +08:00
    @efaun #8
    这样的话,你需要的是一个具有这种功能的 IDE 插件或扩展,而不是问 python 怎么写
    efaun
        16
    efaun  
    OP
       2020-07-27 15:22:43 +08:00
    @imn1 #14 这个方法我知道,如果#10 和#11 帮我组织了语言以后仍然没有解决方案的话,就这样手动操作吧

    感觉我的描述可能懂 java 的更好理解一些,刚学 python,不知道该怎么描述
    efaun
        17
    efaun  
    OP
       2020-07-27 15:23:29 +08:00
    @imn1 #15 对,是这样,方向错了
    GeruzoniAnsasu
        18
    GeruzoniAnsasu  
       2020-07-27 15:25:34 +08:00
    @efaun 创建一个 python test 文件,然后在单元测试类里的函数转调用你的 one two three

    https://imgur.com/a/9gaIqqZ
    imn1
        19
    imn1  
       2020-07-27 15:26:33 +08:00   ❤️ 1
    补个 append 吧,后面进来的人不一定看到这几楼
    我不用 pycharm,所以帮不了你
    efaun
        20
    efaun  
    OP
       2020-07-27 15:29:05 +08:00
    @GeruzoniAnsasu #18 使用单元测试的方法不适合我,python 的单元测试会输出断言结果,而不是代码的执行结果
    xiaolinjia
        21
    xiaolinjia  
       2020-07-27 15:29:20 +08:00
    doctest 、unittest
    Trim21
        22
    Trim21  
       2020-07-27 15:30:16 +08:00
    python 里面一般这么干:

    test_a.py:

    def test_one(): print('one')
    def test_two(): print(2)
    def test_three(): print(3)

    然后 pytest -k 'one or two or three'"
    Trim21
        23
    Trim21  
       2020-07-27 15:31:09 +08:00   ❤️ 1
    pytest 只是屏蔽掉了 stdout,用-s 参数就可以正常输出了
    leishi1313
        24
    leishi1313  
       2020-07-27 15:31:50 +08:00 via Android
    你在 intellij 里用 JUnit 选择执行某一个函数本来就是滥用。
    正规点的用法是写 run 的 configuration,然后 command line 里写-c "from xx import one; one()",要单独执行多少个写多少这样的 config
    efaun
        25
    efaun  
    OP
       2020-07-27 15:34:01 +08:00
    @leishi1313 #24 但是这样很方便不是么~
    efaun
        26
    efaun  
    OP
       2020-07-27 15:36:58 +08:00
    @Trim21 #23 我仔细研究研究,谢谢了
    GeruzoniAnsasu
        27
    GeruzoniAnsasu  
       2020-07-27 15:38:59 +08:00
    @efaun 然而并不

    https://imgur.com/a/B4NN9he

    如果单元测试吐不出 stdout 为啥你第一反应不是去找吐不出 stdout 的原因而是问有没有“其它办法”呢

    话说 jetbrains IDE 旁边这些运行就是给单元测试特化的,如果不是单测文件本来就不会有这些运行按钮
    xinyana
        28
    xinyana  
       2020-07-27 15:41:47 +08:00
    if?
    efaun
        29
    efaun  
    OP
       2020-07-27 15:54:43 +08:00 via Android
    @GeruzoniAnsasu #27
    懂了,thx~
    j0hnj
        30
    j0hnj  
       2020-07-27 15:54:46 +08:00
    chinvo
        31
    chinvo  
       2020-07-27 15:56:12 +08:00 via iPhone
    junut 就是单元测试
    JieS
        32
    JieS  
       2020-07-27 17:31:28 +08:00 via iPhone
    pytest
    也是用 @修饰符来运行方法的,跟 testng,junit 相似
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   973 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:14 · PVG 06:14 · LAX 14:14 · JFK 17:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.