Neste Post vamos criar uma Mini-Interface para executar nossos testes, a mesma tem que fazer 3 coisas basicas. 1. A primeira coisa e ler um arquivo .json que vai conter dados sobre os testes, e pegar qual .json vai ser lido pelo mesmo.2. O segundo passo e executar o teste de forma isolada.3. O Terceira passo apos a execucao capturar os logs e matar os Processos. No entanto tem um grande problema que pode acontecer nesse processo, nao matar os processos filhos daquele determinado processo, assim voce deixa acumular processo em memoria ou seja acumulando lixo no sistema, deixando sua Interface lenta. Outro problema que ja evidenciei e a tentativa de o proprio teste tentar fazer algo atribuido a Interface, isso e uma coisa que nao vai funcionar de maneira adequada. Abaixo vemos com mais detalhes sobre o determinado problema de muitas Interface nao funcionando bem, e porque precisa matar os processos de forma recursiva, neste caso vamos utilizar o Psutil:children(recursive=False)Return the children of this process as a list of Process objects, preemptively checking whether PID has been reused. If recursive is True return all the parent descendants. Example assuming A == this process:A B (child) X (grandchild) Y (great grandchild) C (child) D (child)>>> p.children()B, C, D>>> p.children(recursive=True)B, X, Y, C, DNote that in the example above if process X disappears process Y wont be returned either as the reference to process A is lost.# Funcao do PsUtil pra matar os processos filhos de forma recursiva,# caso der erro ao matar o processo, no .json tem alguns selecionados.def kill_recursive(self, proc_pid, json_file): print ("Matando o Processo de Forma Recursiva: " +str(proc_pid)) try: process = Process(proc_pid) for proc in process.children(recursive=True): proc.kill() process.kill() except NoSuchProcess: print ("o processo nao existe mais.") self.list_kill(json_file)Outro problema que resolvemos no codigo abaixo e abrir o script em um sub-console, o que pode ocorrer que muitas das vezes a Interface poder atrapalhar na execucao dos testes, caso a execucao aconteca no mesmo processo da Interface. self.process = Popen([sys.executable, self.command], creationflags=CREATE_NEW_CONSOLE,stdin=PIPE, stdout=PIPE, stderr=PIPE, )Com as dicas acima, vamos conseguir resolver muitos problemas na hora da execucao dos testes. Vou criar um video explicativo e colocar nosso projeto no bitbucket.org depois. Outra Solucao e executar os testes atraves de uma ferramenta de Integracao Continua como Jenkins, no entanto na Interface voce pode expandir e fazer coisas mais alem, como controlar as maquinas virtuais, armazenar os dados dentro de banco de dados para ter dados estatisticos para analisar futuramente.Segue o codigo do Post realizado, como fiz bem rapido, precisa de alguns melhorias:https://bitbucket.org/masters_test/interfacegit clone git@bitbucket.org:masters_test/interface.gitProblema:Como o mundo nao e mil maravilhas temos um problema grave, dependendo do projeto, alguns programas apos inicializados nao tem como matar ele, neste caso use o os.startfile, nao use o popen, quando colocar na integracao continua ele vai falhar, e voce nao vai saber porque.Referencias:[1] http://pythonhosted.org/psutil/[2] https://pypi.python.org/pypi/psutil[3] https://docs.python.org/2/library/subprocess.html#subprocess.CREATE_NEW_CONSOLE[4] https://docs.python.org/3.6/library/os.html Nessa Postagem vamos falar sobreTestes Unitarios em JavaScript, hoje em dia e um diferencial o testadorconhecer sobre o mesmo, testes unitarios nao e nenhum bicho papao para otestador temer. Muitas empresas como a google fala da evolucao do Quality