如何在CircleCI上设置并发服务以进行测试?

时间:2019-02-25 20:20:04

标签: javascript selenium docker circleci webdriver-io

我有一个使用Jasmine和WebdriverIO运行其测试的应用程序,我想在CircleCI中对其进行自动化。我一般来说都是测试的新手,所以不确定该怎么做。

这就是我所知道的:

  • 要运行测试,我调用import tkinter as tk from tkinter import * class WINDOW(): def __init__(self): self.Settings_Window() def Settings_Window(self): self.settings_window = tk.Tk() self.settings_window.minsize(200,200) self.entry = Entry(self.settings_window) self.entry.pack() self.entry2 = Entry(self.settings_window) self.entry2.pack() self.label1input = StringVar() self.label = Label(self.settings_window,textvariable=self.label1input, bg='yellow') self.label.pack(expand='yes',fill='x') self.label2input = StringVar() self.label2 = Label(self.settings_window, textvariable=self.label2input, bg='yellow') self.label2.pack(expand='yes', fill='x') self.button = Button(self.settings_window,text='SETUP1',command=self.Next) self.button.pack() self.button2 = Button(self.settings_window,text='SETUP2',command=self.Next2) self.button2.pack() self.settings_window.mainloop() def Next(self): self.number=1 self.Return_Label(self.number) def Next2(self): self.number=2 self.Return_Label(self.number) def Return_Label(self,number): self.entry_field_value = self.entry.get() print(self.entry_field_value) #self.label1input.set(self.entry_field_value) setattr(self,'label'+str(number)+'input.set',self.entry_field_value) window=WINDOW()
  • 端口4444上需要一个硒​​服务器(我可以以npm test开头)
  • 该应用程序应在端口80上运行(我可以通过另一个npm start命令使用该端口)
  • 测试完成后,我返回命令行,但其他服务(在p4444和p80上)仍在运行

这是我不完全了解的内容:

  • 在本地,这需要3个终端同时运行,是否可以使用CircleCI做到这一点?
  • 如果是这样,我怎么知道p4444和p80何时可以进行测试,或者在测试完成后取消它们?
  • 我是Docker还是CircleCI问题?

1 个答案:

答案 0 :(得分:0)

为了清楚地回答您的问题,我将参考以下每个命令:

  1. 要运行测试,请运行npm test
  2. 要运行硒,请运行npm start selenium
  3. 要运行您的应用,请运行npm start app

问题/答案:

在本地,这需要3个终端同时运行,是否可以使用CircleCI做到这一点?

是的。您只需要在background设置为true的情况下启动一个过程

即要在后台启动Selenium,您可以运行以下命令

    - run:
        name: Start Selenium in background 
        command: |
          npm start selenium
        background: true

在开始一个过程之后,但在使用它之前,请等待该过程在给定端口上准备就绪

    - run:
        name: Waiting for Selenium server to be ready
        command: |
          for i in `seq 1 10`;
          do
            nc -z localhost 4444 && echo Success && exit 0
            echo -n .
            sleep 1
          done
          echo Failed waiting for Selenium && exit 1

请注意,如果您在上述命令中替换了4444,则可以等待另一个端口上的进程

我如何知道p4444和p80何时可以进行测试,或者在测试完成后取消它们?

您的CircleCi命令可能如下所示

     - run:
        name: Start Selenium in background 
        command: |
          npm start selenium
        background: true
    - run:
        name: Start App in background 
        command: |
          npm start app
        background: true

    - run:
        name: Waiting for Selenium server to be ready
        command: |
          for i in `seq 1 10`;
          do
            nc -z localhost 4444 && echo Success && exit 0
            echo -n .
            sleep 1
          done
          echo Failed waiting for Selenium && exit 

      - run:
        name: Waiting for App server to be ready
        command: |
          for i in `seq 1 10`;
          do
            nc -z localhost 80 && echo Success && exit 0
            echo -n .
            sleep 1
          done
          echo Failed waiting for Selenium && exit 

   - run:
        name: Run Tests 
        command: |
          npm test 

您提出了一个单独的问题-测试完成后,如何取消端口4444和80上的进程?您真的不需要。测试作业完成后,将丢弃容器,并且辅助应用程序将停止。

但是,如果要停止这些进程以运行其他一些作业步骤,则可以运行kill命令(如果不清楚,我可以详细说明)

我是Docker还是CircleCI问题?

在了解如何在CircleCi中运行一系列命令时,这似乎只是一个问题

如果按照上述步骤操作,您应该可以实现目标。