Teste e depuraçãoTesting and debugging

Tal como acontece com a programação clássica, é essencial poder verificar se os programas quânticos funcionam como pretendido, e ser capaz de diagnosticar comportamentos incorretos.As with classical programming, it is essential to be able to check that quantum programs act as intended, and to be able to diagnose incorrect behavior. Nesta secção, cobrimos as ferramentas oferecidas para Q# testar e depurar programas quânticos.In this section, we cover the tools offered by Q# for testing and debugging quantum programs.

Testes de UnidadeUnit Tests

Uma abordagem comum para testar programas clássicos é escrever pequenos programas chamados testes unitários, que executam código numa biblioteca e comparam a sua saída com alguma saída esperada.One common approach to testing classical programs is to write small programs called unit tests, which run code in a library and compare its output to some expected output. Por exemplo, pode garantir que Square(2) os 4 retornos, uma vez que conhece um priori que $2^2 = 4$.For example, you can ensure that Square(2) returns 4 since you know a priori that $2^2 = 4$.

Q#suporta a criação de testes unitários para programas quânticos, e que podem ser executados como testes dentro da estrutura de teste da unidade xUnit.Q# supports creating unit tests for quantum programs, and which can run as tests within the xUnit unit testing framework.

Criação de um Projeto de TesteCreating a Test Project

Open Visual Studio 2019.Open Visual Studio 2019. Vá ao menu 'Arquivo' e selecione New > Project.... No canto superior direito, procure Q# e selecione o modelo Q# do Projeto de Teste.Go to the File menu and select New > Project.... In the upper right corner, search for Q#, and select the Q# Test Project template.

O seu novo projeto tem um único Tests.qs ficheiro, que fornece um local conveniente para definir novos Q# testes de unidade.Your new project has a single file Tests.qs, which provides a convenient place to define new Q# unit tests. Inicialmente, este ficheiro contém um teste de unidade de amostra AllocateQubit que verifica se um qubit recém-atribuído está no estado de $\ket $ e {0} imprime uma mensagem:Initially, this file contains one sample unit test AllocateQubit which checks that a newly allocated qubit is in the $\ket{0}$ state and prints a message:

    @Test("QuantumSimulator")
    operation AllocateQubit () : Unit {

        using (qubit = Qubit()) {
            AssertMeasurement([PauliZ], [qubit], Zero, "Newly allocated qubit must be in the |0⟩ state.");
        }
        
        Message("Test passed");
    }

Qualquer Q# operação ou função que tenha um argumento de tipo Unit e devoluções pode ser marcada como um Unit teste de unidade através do @Test("...") atributo.Any Q# operation or function that takes an argument of type Unit and returns Unit can be marked as a unit test via the @Test("...") attribute. No exemplo anterior, o argumento a esse atributo, "QuantumSimulator" especifica o alvo em que o teste é executado.In the previous example, the argument to that attribute, "QuantumSimulator", specifies the target on which the test runs. Um único teste pode ser executado em vários alvos.A single test can run on multiple targets. Por exemplo, adicione um atributo @Test("ResourcesEstimator") antes AllocateQubit .For example, add an attribute @Test("ResourcesEstimator") before AllocateQubit.

    @Test("QuantumSimulator")
    @Test("ResourcesEstimator")
    operation AllocateQubit () : Unit {
        ...

Guarde o ficheiro e faça todos os testes.Save the file and run all tests. Deve haver agora dois testes de unidade, um em AllocateQubit que corre no , e outro onde corre no QuantumSimulator ResourcesEstimator .There should now be two unit tests, one where AllocateQubit runs on the QuantumSimulator, and one where it runs in the ResourcesEstimator.

O Q# compilador reconhece os alvos incorporados "QuantumSimulator" , e como "ToffoliSimulator" "ResourcesEstimator" alvos de execução válidos para testes de unidade.The Q# compiler recognizes the built-in targets "QuantumSimulator", "ToffoliSimulator", and "ResourcesEstimator" as valid run targets for unit tests. Também é possível especificar qualquer nome totalmente qualificado para definir um alvo de execução personalizado.It is also possible to specify any fully qualified name to define a custom run target.

Testes Q# de unidade de execuçãoRunning Q# Unit Tests

Como configuração única por solução, vá ao menu de Teste e selecione Definições de Teste > Arquitetura do Processador Padrão > X64.As a one-time per-solution setup, go to the Test menu and select Test Settings > Default Processor Architecture > X64.

Dica

A definição de arquitetura de processador padrão para o Visual Studio está armazenada nas opções de solução .suo () ficheiro para cada solução.The default processor architecture setting for Visual Studio is stored in the solution options (.suo) file for each solution. Se eliminar este ficheiro, terá de selecionar o X64 como arquitetura do processador novamente.If you delete this file, then you need to select X64 as your processor architecture again.

Construa o projeto, abra o menu Test e selecione Windows > Test Explorer.Build the project, open the Test menu, and select Windows > Test Explorer. Aloque os ecrãs Debit na lista de testes no grupo Testes de Não Execução.AllocateQubit displays in the list of tests in the Not Run Tests group. Selecione Executar Tudo ou executar este teste individual.Select Run All or run this individual test.