Thanks for the code.
It seems that the additional call of the test method inside the training loop calls into the pseudo-random number generator and thus changes the order of the training data in the next step.
This will result in a bit noise during the training, which thus yields a different end result.
You can check it by printing the sum of the data samples in your training loop (which can be seen as a “unique value” for the sample).
If I add a seeding inside the training loop to make sure the train_loader uses the same order of samples, I get the same results for the additional test call and just the final one:
 for epoch in range(1, epochs + 1):
        torch.manual_seed(seed+epoch+1)
        train(model, device, train_loader, optimizer, epoch,log_interval)
        #test(model, device, test_loader) # uncommenting this line produces the same result now

    test(model, device, test_loader)

I’m unsure, where the test_loader is using random numbers, but based on the current workaround, this is my best guess.