Ottmar Hitzfeld's side waited until there were 12 minutes left on the clock before they opened the scoring and the lead was doubled shortly after as they secured the win
The South Americans have failed to win any of their previous seven fixtures, a 12-month barren run, but Ottmar Hitzfeld’s men struggled to find a way through for large parts of the contest in Lucerne.
And it was Peru who arguably had the best chance to break the deadlock in the first half, when Paolo Hurtado saw his effort pushed wide by goalkeeper Diego Benaglio before the break.
However, the Swiss side's class eventually told as Stephan Lichtsteiner headed home from a Ricardo Rodriguez cross and Xherdan Shaqiri finished from a tight angle to secure a barely deserved scoreline.
This performance and a similarly lacklustre 1-0 win over Jamaica on Friday will be of some concern for Hitzfeld, whose side kick off their World Campaign against Ecuador on June 15.
The German coach named Josip Drmic in place of the misfiring Haris Seferovic, but the opening stages proved uneventful at both ends, with neither side able to put the goalkeepers under pressure.
Left-back Rodriguez – tipped by many to shine in Brazil - was first to threaten, when his 23rd-minute free-kick forced Peru keeper George Forsyth to come off his line and punch to safety.
And the Wolfsburg man tried to force the issue once again moments later, but Forsyth gratefully clung on to his dangerous low cross this time around.
The ball sat up nicely for Granit Xhaka in the penalty area shortly before the half-hour mark, only for 21-year-old to slice his effort high and wide under pressure from Hurtado.
The sometimes-reckless challenges of Luis Ramirez were drawing the ire of the hosts, who were understandably keen to come out of the fixture with a clean bill of health.
Hurtado could have had Peru ahead before half-time, but Benaglio got down well to touch the 12-yard curler around his left-hand post.
Switzerland came out for the second period looking for a much-improved display, but it failed to materialise for much of the half as Peru continued to frustrate their hosts.
However, Lichtsteiner’s 78th-minute headed effort finally got the Swiss off the mark, before Shaqiri – off the bench in place of Xhaka - slotted home through the legs of Benaglio to put some gloss on an otherwise disappointing performance.