You are getting duplicates because in this query BusinessEntityID is not unique.
BusinessEntityID is unique for every Person. But every person may have more than one Address.
By joining together Person with BusinessEntityAdress you get a row for every Address the person has. So if a Person has two Addresses you get two rows.
BusinessEntityID (No column name) City
2996 AmandaSCook Everett
2996 AmandaSCook Everett
2997 AmandaLMorgan San Gabriel
In this example AmandaSCook has two entries in BusinessEntityAddress.
But you still take Person.BusinessEntityID as key to insert into TestDB. That's where your duplicates and PK violations come from.
Given you just want testdata and don't care for the information, try this:
select
p.[BusinessEntityID],
p.[FirstName]+ISNULL(p.[MiddleName], '')+p.[LastName],
a.[City]
FROM [AdventureWorks2008R2].[Person].[Person] AS p
INNER JOIN [AdventureWorks2008R2].[Person].[BusinessEntityAddress] AS b
ON p.BusinessEntityID = b.BusinessEntityID
INNER JOIN [AdventureWorks2008R2].[Person].[Address] AS a
ON a.AddressID = b.AddressID
group by p.[BusinessEntityID],
p.[FirstName]+ISNULL(p.[MiddleName], '')+p.[LastName],
a.[City]
having count(*) = 1