Django自动运行服务器和功能测试

von4xj4u  于 2023-03-31  发布在  Go
关注(0)|答案(1)|浏览(123)

我试图使用invoke模块来自动化我的django功能测试,但是我意识到runserver命令正在我的脚本上滚动,直到它完成才运行下一个命令

from invoke import task

    @task
    def runserver(c):
        c.run('python manage.py runserver')
    
    @task
    def test(c):
        c.run('python functional_test.py')
    
    @task(runserver, test)
    def build(c):
        pass

我想同时运行这两个,也许与异步或threding,但不能弄清楚如何。

5n0oy7gb

5n0oy7gb1#

我最终使用了以下代码,使用@Nealium给出的想法,但使用了Pebble模块:

from time import sleep
from invoke import task
from pebble import concurrent
import os

@task
def runserver(c,ip=None):
    if ip:
        ip_addr = ip
    else:
        ip_addr = None
    @concurrent.thread
    def build(c):
        if ip_addr:
            c.run(f'python manage.py runserver {ip_addr}:8091')
        else:
            c.run('python manage.py runserver')
        sleep(3)
                    
    @concurrent.thread
    def start():
        with open('build.txt','w') as file:
            file.write("Build done")
        c.run('python functional_test.py')
    
    build_future = build()
    start_future = start()
    
    build_done = False
    while not build_done:
        sleep(1)
        try:
            with open('build.txt', 'r') as file:
                content = file.read()
                if 'Build done' in content:
                    build_future.cancel()
                    build_done = True
        except:
            pass
    os.remove('build.txt')
    start_future.result()
  • 像这样,我们可以在终端中调用“invoke runserver”或“inv runserver”(如果你愿意,也可以将其更改为“build”),它会做它必须做的事情并完成test+server。我必须做“build.txt”文件,因为有两个终端(django server和test),一个需要知道另一个何时启动。
  • 我们也可以传递--ip arg,比如:“invoke runserver --ip=0.0.0.0”,端口是固定的,但您已经了解了

相关问题