Изменение тестового модуля Python, казалось бы, выходит за рамки - PullRequest
0 голосов
/ 29 марта 2019

У меня есть следующий код Tic-Tac-Toe:

class TicTacToeBoard:
board = [[0,0,0], [0,0,0], [0,0,0]]

def printBoard(self):
    print(self.board)

def putPiece(self, position1, position2):
    self.board[position1][position2] = 1

Я выполняю модульное тестирование кода, как показано ниже:

def testestablishTicTacToeBoard(self):
    test = TicTacToeBoard()
    self.assertEqual(test.board, [[0,0,0],[0,0,0],[0,0,0]])

def testPutPiece(self):
    test = TicTacToeBoard()
    self.assertEqual(test.board, [[0,0,0],[0,0,0],[0,0,0]])
    test.putPiece(1,1)
    self.assertEqual(test.board, [[0,0,0],[0,1,0],[0,0,0]])

До того, как я провел второй модульный тест, первый модульный тест прошел без проблем. После того, как я сделал второй модульный тест, первый модульный тест больше не проходит с:

self.assertEqual(test.board, [[0,0,0],[0,0,0],[0,0,0]])
AssertionError: Lists differ: [[0, 0, 0], [0, 1, 0], [0, 0, 0]] != [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

Что происходит во втором модульном тесте, из-за которого первый больше не проходит?

1 Ответ

2 голосов
/ 29 марта 2019

Похоже, это потому, что доска является общей для всех экземпляров (это атрибут класса, а не атрибут экземпляра).

Вы можете изменить свой код класса с этим, и он должен работать:

class TicTacToeBoard:

    def __init__(self): 
        # Now each instance (self) has its own board:     
        self.board = [[0,0,0], [0,0,0], [0,0,0]]

    def printBoard(self):
        print(self.board)

    def putPiece(self, position1, position2):
        self.board[position1][position2] = 1

Если вы хотите убедить себя в том, что на самом деле происходит, вы можете сравнить две версии (атрибут instance / class):

class TicTacToeBoard:

    shared_board = [[0,0,0], [0,0,0], [0,0,0]]

    def __init__(self):
        self.board = [[0,0,0], [0,0,0], [0,0,0]]

    def __str__(self):
        return (
            f"Instance board: {self.board}\n"
            f"Class board (shared): {self.shared_board}" 
        )

    def putPiece(self, position1, position2):
        self.board[position1][position2] = 1
        self.shared_board[position1][position2] = 2
>>> b1 = TicTacToeBoard()
>>> b2 = TicTacToeBoard()
>>> b1.putPiece(1, 2)
>>> print(b1)

Instance board: [[0, 0, 0], [0, 0, 1], [0, 0, 0]]
Class board (shared): [[0, 0, 0], [0, 0, 2], [0, 0, 0]]

>>> print(b2)

Instance board: [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
Class board (shared): [[0, 0, 0], [0, 0, 2], [0, 0, 0]]

Обратите внимание, что у второй тиктактой доски b2 нет той, которая находится в позиции (1, 2), но есть две в позиции (1, 2).

...